问题描述
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。给你一个字符串,问最少在字符串尾添加多少字符,可以使得字符串变为回文串。
输入格式
有多组测试数据。
每组测试数据第一行是一个正整数N,表示字符串长度,接下来一行是长度为N的字符串,字符串中只有小写字母。
N=0表示输入结束,并且不需要处理。
40%的数列元素个数N 1 ≤ N≤ 100;
30%的数列元素个数N 1 ≤ N≤ 1000;
20%的数列元素个数N 1 ≤ N≤ 10000;
10%的数列元素个数N 1 ≤ N≤ 100000;
输出格式
对于每组测试数据,输出一个非负整数:添加最少的字符数,可以使得字符串变为回文串。
样例输入
3
aba
4
aaac
0
样例输出
0
3
#include<iostream>
using namespace std;
int main()
{
while(1)
{
int n;
cin>>n;
if(n==0)
{
break;
}
string str;
cin>>str;
//其实就是判断结尾是不是回文串
int pos=-1;
int i=0;
while(1)
{
int flag2=0;
for(;i<n;i++)
{
if(str[i]==str[n-1])
{
pos=i;
flag2=1;//找到了
break;
}
}
if(flag2==0)//非回文串情况1
{
cout<<n-1<<endl;
break;
}
int flag=1;
int m=n-1;
int j=pos;
while(m>=j)
{
if(str[m]!=str[j])
{
flag=0;
}
m--;
j++;
}
if(flag==1)//结尾是回文子串,且此时是最大回文子串
{
cout<<pos<<endl;
break;
}
else//非回文串情况2
{
i=pos+1;
}
}
}
}