#include <iostream> #include <cstring> using namespace std; string longestPalindrome(string s) { string str = "?#"; for(int i = 0; i < s.size(); i++) //字符串长度奇偶变换,添加'$'防止数组越界 { str += s[i]; str += "#"; } str += "?"; //cout<<str; int p[str.size()-2]={0}; //定义p[i]数组 int right = 0, mid = 0; for(int i = 1; i < str.size()-1; i++) { if(right > i) { p[i] = (p[2*mid - i] < (right - i) ? p[2*mid - i] : (right - i)); //计算以i为中心的回文字串的最小长度 } else { p[i] = 1; } while(str[i - p[i]] == str[i + p[i]]) p[i]++; //回文子串长度延伸 if(i + p[i] > right) { right = i + p[i]; mid = i; } } int max = 0, middle=0; for(int i = 1; i < str.size()-1; i++) //生成最终结果 { if(p[i] > max) { middle = i; max = p[i]; } } max--; int start = middle - max ; int end = middle + max; string result; for(int i = start; i <= end; i++) { if(str[i] != '#' && str[i] != '?') { result += str[i]; } } //cout<<result; return result; }
int main() { string s1="xschhsdr"; string s2="vffabbaabbbabaababbbacisd"; cout<<longestPalindrome(s1)<<endl; cout<<longestPalindrome(s2)<<endl; return 0; }