对于给定的一个字符串如ABCABA ,求它的最长回文字串,这个就是ABC ,如果有大于一个长度相同的最长回文字串,则输出最靠前的那一个,例如:XYZ,则输出X。
很容易想到一个一个比较么!但有没有更简单的方法呢?想起以前看的一道题,给你一个原串str,假如是ABCDE,它可以循环移动,即可以移动成BCDEA , CDEAB ,DEABC, EABCD,现在给你另一个字符串s,问s 是否被包含在原串str中?
答案给出了一个很巧妙的解决方法,把原串改为2str,即把原串变为原来的两倍,这样不管它移动,如果s包含在其中,就可以直接找到,不用再循环移动了!
这道题,我用的事一次次截取的办法,最长的回文字串就是它本身,然后剪掉一个、两个、……最小就是一个字符!把原串逆过来,再查找截取的串是否在逆序存放的串里!
#include<iostream>
#include<stdio.h>
#include<sstream>
using namespace std;
int main()
{
//freopen("in.txt","r",stdin);
string str;
string res;
int n;
int i,j,len;
bool flag=0;
scanf("%d",&n);
while(n--)
{
cin>>str;
len=str.length();
res=str;
for(i=0;i<len;i++)
res[i]=str[len-i-1];
flag=0;
for(i=0;i<len;i++)
{
for(j=0;j<=i;j++)
{
string sub=str.substr(j,len-i);
if(res.find(sub)!=string::npos)
{
flag=1;
cout<<sub<<endl;
// printf("%s\n",sub);
break;
}
}
if(flag)
break;
}
}
return 0;
}