题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。
比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。
方法:
1. 值得注意的是,回文的2种形式,aba, abba;
1.对于aba的形式, 从字符串中的每一个位置i,像两边扩展一位如果a[i-1]=a[i+1],那么继续扩展,直到a[i-k]!=a[i+k]或者i-k,i+k超出了数组的边界。
2. 对于与abba形式,从第一个b开始,首先判断a[i] == a[i+1]是否为真,然后从i-1,i+1+1开始分别向两边扩展,直到a[i-k] != a[i+1+k]或者i-k,i+k+1超出了数组的边界。
3. 总结一下,对于每一个位置i,向两边扩展的时候都要考虑上面2种情况。
#include<iostream>
using namespace std;
void display(char *str,int from,int to)//输出from和to位置之间的字符串
{
while(from<=to)
{
cout<<*(str+from);
from++;
}
cout<<endl;
}
int fun(char *str)
{
if(str ==NULL)
return0;
int len =strlen(str);
if(len ==1)
return 1;
int i=0;
int max =1;
while(i<len-1)
{
if(str[i] == str[i+1]) //判断是否是abba类型的回文
{
int k=1;
while((i-k)>=0&& (i+1+k)<len && str[i-k]==str[i+1+k])
k++;
k--;
cout<<i<<" even: ";
display(str,i-k,i+1+k);
int lena = 2*k;
max = lena>max?lena:max;
}
//判断是否是aba类型的回文
int k=1;
while((i-k)>=0&& (i+k)<(len-1) && str[i-k]==str[i+k])
k++;
k--;
cout<<i<<" odd:";
display(str,i-k,i+k);
int lena = 2*k+1;
max =lena>max?lena:max;
i++;
}
returnmax;
}
int main()
{
char*str="daaccacdaaaddf";
cout<<fun(str)<<endl;
getchar();
return 0;
}