第五题:回文问题(网上借鉴)
1.边界情况:
字符串为空或只有一个字符。
2.思路:
这道题还是很简单的,就是遍历字符串,以每个字符为中心向两边扩展,找到一个子回文串然后判读是不是最长的就ok了,
但是有一个问题就是回文串有两种,一种我叫做是偶的(1122),一种叫做奇的(11322),这样在每次判断的时候就要判断两次;
例如
aaa
我们从第二个字符开始
情况1 奇的
以第二个a为中心得到 aaa 回文串
情况2偶的
以第二个a为中心得到aa回文串
这样已经解决,但如果要100%就要解决这个奇偶问题
所以字符串中插入字符(这个人采用插入#)
例如 字符串aaa
变为a#a#a#
这样就没有奇偶问题了
算法代码
string longestPalindrome(string s) {
string t = "$#";
for (int i = 0; i < s.size(); ++i) {
t += s[i];
t += "#";
}
// Process t
vector<int> p(t.size(), 0);
int mx = 0, id = 0, resLen = 0, resCenter = 0;
for (int i = 1; i < t.size(); ++i) {
p[i] = mx > i ? min(p[2 * id - i], mx - i) : 1;
while (t[i + p[i]] == t[i - p[i]]) ++p[i];
if (mx < i + p[i]) {
mx = i + p[i];
id = i;
}
if (resLen < p[i]) {
resLen = p[i];
resCenter = i;
}
}
return s.substr((resCenter - resLen) / 2, resLen - 1);
}
static const int _ = []() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
return 0;
}();//一定要加上这个 具体意义自己百度