Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
这个问题是求一个字符串里面最长的回文子串,之里面要考虑两种回文情况,一种是偶数位的,这种子串的检测方式是遍历原子串判断有没有连续两位是相同的,如果有,则以这两位开始作为中央向前后检测,没检测到前后有相同位则当前回文串长度加2,直到检测到不相同为止。
另一种情形是回文串是奇数位的,这种情况的话则遍历原子串,判断是否有当前位[I]与[I+2]位相同,如果有就开始前后检测,之后的操作与偶数位的情况相同。
两种情形的检测都将与原最大串进行长度比较,若比原最大长则储存当前最大子串信息(包括长度与结束位),以便最后进行返回输出。
值得留意的一种情况是全部字符都相同的情况如”bbbbb”,这时候若仅以某一种情况来检测都是有可能错的,例如第二位的b若以偶数情形来开始检测则最后只能得到”bbbb”的最长回文串,但实际上它也可以用奇数位情形来进行检测,因此对于用奇数位情形和偶数为情形来检测的情况不应该用if和else来区分,而应该属于均要检测的情况。
我的代码:
class Solution {
public:
string longestPalindrome(string s) {
int outcome = 0;
int lo = 0;
int curmax = 0;
string x;
if (s.size() <= 1)
return s;
for (int i = 0; i < s.size(); i++) {
if(i>0&&s[i-1]==s[i+1]){
curmax = 3;
int j = 2;
while (i - j>=0&&j+i<s.size()) {
if (s[i - j] == s[i + j]) {
curmax = curmax + 2;
j++;
}
else
break;
}
if (curmax > outcome) {
lo = i+j-1;
outcome = curmax;
if (outcome == s.size())
break;
}
}
if(s[i]==s[i+1]){
curmax = 2;
int j = 1;
while (i - j>=0 &&i + j<s.size()) {
if (s[i - j] == s[i + 1 + j]) {
curmax = curmax + 2;
j++;
}
else
break;
}
if (curmax > outcome) {
lo = i+j;
outcome = curmax;
if (outcome == s.size())
break;
}
}
}
for (int i = 0; i < outcome; i++) {
x += s[lo - i];
}
return x;
}
};