输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“goooogle”, 由于该字符串里最长的对称子字符串是“goooog”, 因此输出 6。
#include<iostream.h>
/*利用栈,字符进站,如果相同出战,不相同进站,对于奇数的情况加以判断
*/
void main()
{
char *ch="aadgobabogleabcba";
int i=0,maxlen=0,num=0,top=-1;
char zh[50];
while(ch[i]!='\0')
{
if(top==-1)
zh[++top]=ch[i];
else
{
if(zh[top]==ch[i])
{
num=num+2;
top--;
}
else if(zh[top-1]==ch[i])//识别出奇数的情况
{
if(num%2==0)
{
top=top-2;
num=3;
}
else
{
zh[++top]=ch[i];
num=0;
}
}
else
zh[++top]=ch[i];
if(num>maxlen)
maxlen=num;
}
i++;
}
cout<<maxlen<<endl;
}
--------------------------------------------------------------------------------------------------------------------------
字符串中的每一个开始,向两边扩展,此时可分为两种情况:
(1)对称子串长度是奇数时, 以当前字符为对称轴向两边扩展比较
(2)对称子串长度是偶数时,以当前字符和它右边的字符为对称轴向两边扩展
#include<iostream.h>
/*字符串中的每一个开始,向两边扩展
*/
void main()
{
char ch[]="aadgobabogleabcba";
int num=0,maxlen=0;
char *start,*left,*right;
for(start=ch;*start;start++)
{
num=1;//对称字串可能为奇数时
left=start-1;
right=start+1;
for(;left>=ch&&right<=ch+sizeof(ch)-2;left--,right++)
if(*left==*right)
num+=2;
else
break;
if(num>maxlen)
maxlen=num;
num=0; //对称字串可能为偶数时
left=start;
right=start+1;
for(;left>=ch&&right<=ch+sizeof(ch)-2;left--,right++)
if(*left==*right)
num+=2;
else
break;
if(num>maxlen)
maxlen=num;
}
cout<<maxlen<<endl;
}