回文串(两种方法)

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

例如:level、abba 这两个字符串就被称为回文串

判断回文串,我推荐两种方法:反转比较法和中分比较法(名称是自己起的哈,有些丑陋

一、反转比较法

对于c++的同学这个就十分简单了
我们输入的字符串类型定位string型,然后使用reverse函数就可以,然后我们直接比较str1与str2是否相等,相等的话那么就表示输入的字符串为回文串。

reverse(str2.begin(), str2.end());

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

reverse(str2,str2+strlen(str2));

对于不让用函数或者是c的同学,那就自己写一个reverse函数,这个还是比较好实现的,定义一个新的数组,然后通过递归进行反转。

void reverse(char * str)
{
    int len=strlen(str);
    char *ch=str+len-1;
    while(len>1)
    {
        char tmp=*str;
        *str=*ch;
        *ch='\0';       
        reverse(str+1); 
        *ch = tmp;
        len--;
    }
}

二、中分比较法

这种方法的话这里我介绍用带头结点的单链表存每一个元素,我们再建立一个栈,我们用栈存放前半部分的数据,如果数据元素个数是奇数的话,我们加一个特判,不处理这个节点。当链表当前节点走到一半后,我们对栈顶元素与当前节点进行比较,如果不相等,那么就说明不是回文串,,如果相等栈顶元素出栈,指针往后一位。如果走到结尾都相等的话,那么就表示是回文串。
下面代码输入格式为:
字符串长度
字符串

例如:
5
abbba

#include<stdio.h>
#include<stdlib.h>
typedef struct node{
	char num;
	struct node *next;
}LinkList;
LinkList *init(LinkList *l)
{
	l=(LinkList *)malloc(sizeof(LinkList));
	l->next=NULL;
	return l;
}
LinkList *create(int n)
{
	int i,x;
	LinkList *l,*tmp,*p;
	l=init(l);
	tmp=l;
	for(i=0;i<n;i++)
	{
		scanf("%c",&x);
		p=(LinkList *)malloc(sizeof(LinkList));
		p->num=x;
		p->next=NULL;
		tmp->next=p;
		tmp=tmp->next;
	}
	return l;
}
int cala(LinkList *l,int n)
{
	char a[1005];
	int mid=n/2,i=1,na=0;
	LinkList *tmp;
	tmp=l->next;
	while(tmp)
	{
		if(mid+1==i&&n%2!=0) 
		{
			i++;
			tmp=tmp->next;
			continue;
		}
		else if(i<=mid) a[na++]=tmp->num;
		else if(i>mid)
		{
			if(a[--na]!=tmp->num)
			{
				return 0;
			}
		}
		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");
	else printf("No\n"); 
	return 0;
}

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值