如何改进这个O(n ^ 2)字符串操作解决方案?

时间:2016-10-11 02:33:05

标签: algorithm

编写一个函数,它接受一个字符串的输入并返回元组的数量。 (x,y)形式的元组,其中 x 是'a'的索引, y 是'b'和的索引x< ÿ

示例:对于“aab”,答案是两个  对于“ababab”,答案是六个

可以在O(n ^ 2)中通过简单地查找每个'a'之后的b的数量来完成,但我不知道如何在O(n)中进行。 我已经尝试用2个指针遍历字符串,但我总是错过一些元组。我不确定这是否可以在O(n)时间内完成。

3 个答案:

答案 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)

来完成
  1. 从前到后遍历字符串
  2. 记录“a”出现的数字
  3. 对于每次“b”遭遇,请添加“a”记录的数字