查找最长回文字符串子串,考虑从中间向两边比对查找,并记录最长子串的边界。
注意:比对时,将中间相同的字符当作一个中间点,则不需要单独判断回文串奇偶的情况。
#include<bits/stdc++.h>
using namespace std;
string longestPalindrome(string s) {
if(s.length() == 0)return "";
int s_begin=0, s_end=0;
for(int i = 0; i < s.length(); i++){
int high = i, low = i;
while(high + 1 < s.length() && s[high + 1] == s[i]){
high++;
}
while(low > 0 && s[low - 1] == s[i]) {
low --;
}
while(high < s.length() - 1 && low > 0 && s[high + 1] == s[low - 1]){
high++;
low--;
}
if(high - low > s_end - s_begin){
s_begin = low;
s_end = high;
}
}
return s.substr(s_begin, s_end-s_begin + 1);
}
int main(){
string s;
cin>>s;
cout<<longestPalindrome(s);
return 0;
}
待优化:遍历到连续相同字符时,不进入循环体比对,直接跳到下一个不相等的字符。