回文子串是什么意思,回文串构建

回文串:一串正着读和反着读都是一样的一种特殊字符串

例如,level、abba这样的字符串称为回文字符串

判断回文串,我推荐两种方法。反转比较法和中分比较法

一、翻转比较法对C同学来说非常简单

我们输入的字符串类型找到string类型,使用reverse函数就可以了。 然后直接比较str1和str2是否相等。 如果等于,则意味着输入的字符串是回文字符串。

reverse(str2.Begin )、str2.end );

当然,也可以输入char、int数组。 直接使用reverse函数

reverse(str2,str2strlen ) str2);

对于不用函数或C的学生,自己写reverse函数。 这还很容易实现。 定义新数组,并通过递归进行反转。

voidreverse(char*str ) intlen=strlen ); char *ch=str len-1; wile(len1) { char tmp=*str; *str=*ch; *ch=’\0 ‘; reverse(str1; *ch=tmp; len–; )二、如果是比较法,这里介绍用开头节点的单链接列表保存各要素。 再做一个栈。 在堆栈中保存前半部分的数据。 如果数据元素的数量为奇数,则添加不处理此节点的特殊判断。 当链表中的当前节点减半时,将堆栈中的顶级元素与当前节点进行比较,指出它们必须相等才能是回文字符串。如果相等堆栈的顶级元素从堆栈中出来,则指针在后面一个。 如果到最后也相等,则表示是回文串。

以下代码输入格式如下。

字符串长度

字符串

例如:

5

abbba

# include stdio.h # include stdlib.htypedefstructnode { charnum; struct node *next; }LinkList; linklist*init(linklist*L ) l=(linklist * ) malloc ) sizeof ) link list ); l-next=NULL; 返回l; }linklist*create(intn ) {int i,x; LinkList *l,*tmp,*p; L=init(L; tmp=l; for(I=0; in; I ) Scanf(‘%c ‘,x ); p=(linklist* ) malloc (sizeof ) linklist ); p-num=x; p-next=NULL; tmp-next=p; tmp=tmp-next; }return l; (intcala ) linklist*L,int n ) {char a[1005]; int mid=n/2,i=1,na=0; 链接列表* tmp; tmp=l-next; while(tmp ) if ) mid1==in%2!=0() I tmp=tmp-next; 连续; }elseif(I=mid ) a[na ]=tmp-num; elseif(imid ) if ) a(–na )!=tmp-num({return0; (I ); tmp=tmp-next; }return 1; (}int main ) ) {LinkList *l; int n,I,flag; scanf(‘%d ‘,n ); getchar (; L=create(n ); flag=Cala(L,n ); if(flag ) printf(yes(n ); ELSEprintf(no ) n ); 返回0; }

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注