您必须从用户处获取字符串的长度,然后从用户处输入字符串,然后再取no。用户查询的数量。假设用户给出3个查询4,5,7。那么4,5,7是您必须检查在该位置之前重复多少个相同字符的位置。
输入:
输出:
我编写的代码:
#include <iostream>
int main()
{
int n; // Length of String
int a[10000]; // Input for Query
int q; // NO. of queries
std::cin >> n;
char ch[n]; // To store the InputString
for (int i = 1; i <= n; i++) {
std::cin >> ch[i];
}
std::cin >> q;
for (int j = 1; j <= q; j++) {
std::cin >> a[j];
}
for (int i = 1; i <= q; i++) {
int count = 0;
for (int j = 1; j < a[i]; j++) {
if (ch[j] == ch[a[i]]) {
count = count + 1;
}
}
std::cout << count << "\n";
}
return 0;
}
但是问题是程序的时间复杂度太大,在最坏的情况下是 O(n * q),其中n =字符串的长度,q =字符串的数量查询。如何提高时间复杂度?
答案 0 :(得分:0)
首先,您的输出不符合分配条件。例如,在位置[1]
处,有一个字符'b'
(基于0的索引),在该位置之前零个重复。在位置[2]
处,有一个字符'a'
,该字符在该位置之前有一个重复。那么,您是说之前包括吗?
第二,这是homework吗? (只是好奇。在这里几乎无法想象任何现实情况……:))
最后,您的问题:
1)组成<query position, count>
对的数组
2)仅通过InputString
一次,直到最高query position
,并在InputString
中的每个位置增加count
如果与query position
对中的<query position, count>
相关。
2.b)进一步优化:首先根据<query position, count>
对数组或query position
对进行排序。在您的InputString
中,转到最低 query position
,以便在第一轮中必须检查每对<query position, count>
。然后,从[最低InputString
+ 1]位置开始搜索query position
,直到第二最低的query position
。您无需担心第二轮中最低的<query position, count>
对。等等...