回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。
输入一个字符串Str,输出Str里最长回文子串的长度。
Input
输入Str(Str的长度 <= 1000)
Output
输出最长回文子串的长度L。
Input示例
daabaac
Output示例
5
解法一:
暴力枚举所有串
若当前枚举串长度大于已知最大回文串
传到函数里判断是否是回文串
#include <iostream> using namespace std; bool fun(string x,int len) { for(int i = 0, j = len - 1; i <len / 2; i++, j--) { if(x[i] != x[j]) return false; } return true; } int main() { ios::sync_with_stdio(false); string text,tmp; int maxlen = 1, len; cin>>text; for(int i = 0; i < text.length(); i++) { tmp = text[i]; for(int j = i + 1; j < text.length(); j++) { tmp = tmp + text[j]; len = tmp.length(); if(len > maxlen) { if(fun(tmp,len)) { maxlen = len; } } //cout<<tmp<<' '<<len<<endl; //cout<<fun(tmp,len)<<endl; } } cout<<maxlen<<endl; return 0; }
解法二:
若连着两个字符相等
如aa 则初始长度为2
前后枚举是否相等 长度每次加2;
若隔一个字符相等 如aba 则初始长度为3
前后枚举是否相等 长度每次加2;
比较求解
时间可以控制在15ms内
#include <iostream> using namespace std; int main() { string a; cin>>a; int maxlen = 1, tmplen = 0, alen = a.length(); int fst, lst; for(int i = 0; i < alen; i++) { if(a[i] == a[i + 1]) { tmplen = 2; fst = i - 1; lst = i + 2; while(a[fst] == a[lst] && fst >= 0 && lst < alen) { tmplen += 2; fst--; lst++; } } if(tmplen > maxlen) { maxlen = tmplen; } if(a[i - 1] == a[i + 1]) { tmplen = 3; fst = i - 2; lst = i + 2; while(a[fst] == a[lst] && fst >= 0 && lst <= alen) { tmplen += 2; fst--; lst++; } } if(tmplen > maxlen) { maxlen = tmplen; } } cout<<maxlen<<endl; return 0; }