1088最长回文子串
【问题描述】
输入一个字符串Str,输出Str里最长回文子串的长度。
回文串:指aba、abba、cccbccc、aaaa这种左右对称的字符串。
串的子串:一个串的子串指此(字符)串中连续的一部分字符构成的子(字符)串
例如 abc 这个串的子串:空串、a、b、c、ab、ac、bc、abc
输入
输入Str(Str的长度 <= 1000)
输出
输出最长回文子串的长度L。
输入样例
daabaac
输出样例
5
代码:
#include<bits/stdc++.h>
using namespace std;
string s;
bool H(int l,int r)
{
for(int i=l,j=r;i<=j;i++,j--) //i<=j保证可以是单长度,也可以是双长度
{
if(s[i]==s[j])
{
continue;
}
else
{
return false; //不是回文子串退出返回false
}
}
return true;
}
int main()
{
int maxn = -1; //单个字符右减左(如1-1)等于0
cin >> s;
for(int l=0;l<s.size();l++) //字串符长度是从0开始
{
for(int r=l;r<s.size();r++)
{
if(H(l,r)) //判断是否为回文子串
{
if((r-l>maxn)) //寻找最长回文子串长度
{
maxn = r-l; //保存最长回文子串长度
}
}
}
}
cout << maxn+1; //原长度从0开始
return 0;
}
貌似稍优化:
#include<bits/stdc++.h>
using namespace std;
string s;
bool H(int l,int r)
{
for(int i=l,j=r;i<=j;i++,j--)
{
if(s[i]==s[j])
{
continue;
}
else
{
return false; 不是回文子串退出返回false
}
}
return true;
}
int main()
{
cin >> s;
int n = s.length(); //取子符串长度 等价于 int n = s.size()
for(int len=n;len>=1;len--) //从最长回文子串长度开始枚举
{
for(int l=0;l<n;l++) //从各个字符开始依照len长度寻找回文子串
{
int r = l+len-1; //右等于字符开始位置+len长度-1(从0开始)
if(H(l,r)) //判断是否为回文子串;
{
cout << len; //如果寻找到一个子串,此子串即最长子串,直接输出len
return 0;
}
}
}
return 0;
}