//使用中心拓展法,从每一个s[i]向左右两边拓展 //使用maxlen来记录最长回文子串的长度 //使用start来记录最长回文子串的起始index //每一次遍历的过程中: //对于每一个s[i],每次进入拓展前设置len为1,即它自己 //使用left来记录当前回文子串的起始index //使用right来记录当前回文子串的结束index //每次对s[i]的拓展结束以后,比较len是否大于maxlen,更新maxlen并更新start=left //遍历完成以后,最长回文子串的起始index==start,结束index=maxlen; #include<iostream> #include<string> using namespace std; int main() { string s; getline(cin,s); int maxlen=0,start=0; int left=0,right=0; for(int i=0;i<s.size();i++) { int len=1; left=i,right=i; //向左拓展 while(left-1>=0&&s[left-1]==s[i]) { left--; len++; } //向右拓展 while(right+1<s.size()&&s[right+1]==s[i]) { right++; len++; } //向左右同时拓展 while(left-1>=0&&right+1<s.size()&&s[left-1]==s[right+1]) { left--; right++; len+=2; } //更新maxlen if(len>maxlen) { maxlen=len; start=left; } } cout<<maxlen<<endl; return 0; }