【发布时间】:2020-03-26 10:24:35
【问题描述】:
最长回文子串问题:
给定一个字符串 s,返回 s 中最长的回文子串。
例如。
Input: s = "babad"
Output: "bab"
Note: "aba" is also a valid answer.
问题
下面的代码是 Errichto(codeforces 的 RedCoder)的解决方案。这是对同一问题的 O(N^3) 解决方案的改进。在他的 youtube 频道上,他一步一步地逐步更有效地解决问题。但是我很难理解他对这个解决方案的方法。我的问题是:
-
good函数中L + x <= n条件有什么用 - 在进行二分搜索之前,似乎已经完成了一些与奇偶校验相关的事情。为什么?它对解决方案的贡献是什么?
- 这里的二分搜索有点奇怪。我了解基本的二进制搜索,但没有得到这个变体。谁能帮我解释一下?
代码
bool is_palindrome(string s) {
string rev = s;
reverse(rev.begin(), rev.end());
return s == rev;
}
// returns true if there is a palindrome of length x
int good(int x, string s) {
int n = s.length();
for(int L = 0; L + x <= n; L++) {
if(is_palindrome(s.substr(L, x))) {
return L;
}
}
return -1;
}
class Solution {
public:
string longestPalindrome(string s) {
int best_len = 0;
string best_s = "";
int n = s.length();
for(int parity : {0, 1}) {
int low = 1, high = n;
if(low % 2 != parity) low++;
if(high % 2 != parity) high--;
while(low <= high) {
int mid = (low + high) / 2;
if(mid % 2 != parity) {
mid++;
}
if(mid > high) {
break;
}
int tmp = good(mid, s);
if(tmp != -1) {
if(mid > best_len) {
best_len = mid;
best_s = s.substr(tmp, mid);
}
low = mid + 2;
}
else {
high = mid - 2;
}
}
}
return best_s;
}
};
【问题讨论】:
-
为什么要解释这个糟糕的代码?
-
社区是为了帮助他人。我发现这段代码很复杂,需要帮助。
-
您可以在互联网上找到任何不良代码,但这并不意味着社区应该花时间去挖掘不良代码。
-
我努力解决这个问题..当我无法得到它时,我才寻求帮助。另外,我不会强迫任何人提供帮助。我会感谢任何给我答案的人。
标签: c++ c++11 binary-search longest-substring