这个算法的最坏运行时间是多少?

时间:2013-09-15 05:38:22

标签: c++ string optimization

我正在为我的Facebook采访学习一些代码。我理解这个算法的作用,但我无法弄清楚它的复杂性。这就是我访问的website所说的内容:

  

由于围绕其中心扩展回文可能需要O(N)时间,因此整体复杂度为O(N ^ 2)。

有人可以向我解释他们如何获得运行时间,特别是平均和最差情况吗?

给出的问题是找到最大的回文子串。我对字符串很陌生。

我也想知道你们是否认为我应该学习Manacher的算法,即O(N)。这是一个使用更少内存的更好的解决方案,但我很难理解。

string expandAroundCenter(string s, int c1, int c2) {
  int l = c1, r = c2;
  int n = s.length();
  while (l >= 0 && r <= n-1 && s[l] == s[r]) {
    l--;
    r++;
  }
  return s.substr(l+1, r-l-1);
}

string longestPalindromeSimple(string s) {
  int n = s.length();
  if (n == 0) return "";
  string longest = s.substr(0, 1);  // a single char itself is a palindrome
  for (int i = 0; i < n-1; i++) {
    string p1 = expandAroundCenter(s, i, i);
    if (p1.length() > longest.length())
      longest = p1;

    string p2 = expandAroundCenter(s, i, i+1);
    if (p2.length() > longest.length())
      longest = p2;
  }
  return longest;
}

1 个答案:

答案 0 :(得分:1)

阅读Big O notationAnalysis of algorithms以及this,然后回过头来看看我的其余部分是否有意义。

如果字符串本身是回文之前我会用O(n)算法检查。

让我们看一下,你有一个运行n次的for循环,在每次迭代时,你调用一个运行的函数......好吧,最糟糕的情况是你每次调用时都会找到最长的回文{{{ 1}}即迭代一直运行到expandAroundCenter。这意味着该算法为l < 0 || r > n-1。现在,如果我们找到O(min(i, n-i))的1到n之和,我们得到this,它是O(n²)。