Facebookのインタビュー用にいくつかのコードを勉強しています。このアルゴリズムの機能は理解できますが、その複雑さがわかりません。これは私が訪問したウェブサイトに記載されているものです:
回文を中心に展開すると O(N) の時間がかかるため、全体の複雑さは O(N^2) になります。
具体的には、平均的なケースと最悪のケースで、その実行時間をどのように取得したかを誰か説明してもらえますか?
与えられた問題は、最大の回文部分文字列を見つけることです。私は文字列が初めてです。
また、O(N) である Manacher のアルゴリズムを学ぶ必要があると考えているかどうかも知りたいです。メモリの使用量が少ないより良い解決策ですが、私には理解するのが本当に難しいです。
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;
}