编写一个函数,它接受一个字符串的输入并返回元组的数量。 (x,y)形式的元组,其中 x 是'a'的索引, y 是'b'和的索引x< ÿ
示例:对于“aab”,答案是两个 对于“ababab”,答案是六个
可以在O(n ^ 2)中通过简单地查找每个'a'之后的b的数量来完成,但我不知道如何在O(n)中进行。 我已经尝试用2个指针遍历字符串,但我总是错过一些元组。我不确定这是否可以在O(n)时间内完成。
答案 0 :(得分:0)
我们的想法是在字符串中存储 ith 位置后面的数量。
int main() {
string ss;
ss = "ababab";
int NumberOfAs = 0; //The amount of A that we have encountered
int Answer = 0; //The sum of the possible tuples
int StringLen = ss.length(); //We store the length of the string to avoid
//checking it in O(n) time each iteration of the for
for (int i=0; i < StringLen; i++){
if (ss[i] == 'a') //If it's an 'a' we increase the counter
NumberOfAs++;
if (ss[i] == 'b') //If it's a 'b' we sum the possible tuples
Answer += NumberOfAs;
}
printf("%d\n", Answer); //cout from c.
return 0;
}
我们可以使用一个不影响我们空间复杂度的额外变量来存储 ith positino中的数量。
结果将是O(N)及时,其中N是字符串的长度。空间复杂度为O(1)
答案 1 :(得分:0)
此问题是反转计数问题的特例。通常问题出在 O(nLog(n))中。它可以使用不同的方法解决:
但是在这种特殊情况下,当你只有两种类型的元素时,它可以在 O(n)中完成,正如其他答案所解释的那样。只需记住遍历字符串时a
的出现次数,并在遇到b
时将它们加在一起。
答案 2 :(得分:-2)
这可以通过O(n)
来完成