我正在为我的 Facebook 面试学习一些代码。我理解这个算法的作用,但我无法弄清楚它的复杂性。这是我访问过的网站上所说的:
由于围绕中心展开回文可能需要 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;
}