迴文串(兩種方法)

迴文串:一串正着讀和反着讀都是一樣的一種特殊字符串

例如: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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章