#include<bits/stdc++.h>
using namespace std;
class Solution { //ps:测试样例:"acbca"
public:
string longestPalindrome(string s) {
if (s.length() <= 1) { //当字符串太短,直接返回本身
return s;
}
int begin = 0, end = 0, max_length = 0; //最长回文子串的开始、终止下标,以及长度
int i, j;
bool judge[1000][1000] = {}; //注意设置bool,否则int型无法定义到1000,会超界
for (i = 1; i < s.length(); i++) {
for (j = 0; j < i; j++) {
/*首尾相等。
并且要么在首尾相等的情况下,首尾之间的字符少于3个,则默认是回文串;
要么大于3个,但是前面之间已经符合回文串(cbc)了,那么此次首尾又相等,
则中间不用再判断,默认加上后就是个更大的回文串了*/
if (s.at(j) == s.at(i) && (i - j + 1 <= 3 || judge[j + 1][i - 1] == true)) {
judge[j][i] = true;
int length = i - j + 1;
if (length > max_length) {
max_length = length;
begin = j;
end = i;
}
}
}
}
if (max_length == 0) { //当不存在回文串,则首字母本身要算个回文串
max_length = 1;
}
return s.substr(begin, max_length); //从下标begin开始,截取max_length个字符的字符串
}
};
int main() {
Solution sol;
string s;
while (1) {
cin >> s;
cout << sol.longestPalindrome(s) << endl << endl;
}
return 0;
}
详解:
测试结果: