1. 程式人生 > >判斷一個字串是否為另外一個字串旋轉之後的字串。 例如:給定s1 = AABCD和s2 = BCDAA,返回1,給定s1=abcd和s2=ACBD,返回

判斷一個字串是否為另外一個字串旋轉之後的字串。 例如:給定s1 = AABCD和s2 = BCDAA,返回1,給定s1=abcd和s2=ACBD,返回

        判斷一個字串是否為另外一個字串旋轉之後的字串。例如:給定s1 = AABCD和s2 = BCDAA,返回1,給定s1=abcd和s2=ACBD,返回0

方法一:

演算法思想:一個字串左旋,無非還是這個字串本身(長度未改變),並且字元本身未改變只是順序改變;申請一個原來字串陣列空間的2倍加1(算上\0),如果另一個比

較物件如果是這個字串的子串(其中用到strstr函式),說明 二者互為左旋字串(前提是長度必須相等)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int find_substring(char *msg, char *substring)
{
	int len=strlen(msg);
	char *tmp=(char*)malloc(2*len+1);  //申請2倍陣列空間
	if(len==strlen(substring))  //保證要比較的兩個字串長度相同
	{
		strcpy(tmp, msg);  //原來的字串拷貝到新空間裡
		strcat(tmp,msg);  //字串的拼接,實現複製
		if(strstr(tmp, substring)!=NULL)
		{
			return 1;
		}
	}
	free(tmp);  //釋放申請的新空間
	return 0;
}
int main()
{
	char arr1[]="abc123";
	char arr2[]="abc123";
	printf("%d\n",find_substring(arr1, arr2));
	return 0;
}
方法二:

演算法思想:從字串2的第一個字元開始掃描,在字串1中尋找和它一樣的字元,一旦找到將這個陣列元素置‘\0’,掃描完畢之後,在字串1中尋找非‘\0’的字元,如果找不

到說明二者互為左旋字串,否則肯定不是(由於字串左旋之後字串中的字元是不變的)

#include <string.h>
int main()
{
	int i=0,j=0;
	char arr1[]="abyde";
	char arr2[]="cdeab";
	int len1=strlen(arr1);
	int len2=strlen(arr2);
	for(i=0;i<len1;i++)  //以字串1為物件,掃描字串2,只要找到和字串用元素相同的,將鈣元素置‘\0’
	{
		for(j=0;j<len2;j++)
		{
			if(arr1[i]==arr2[j])
			{
				arr1[i]='\0';
				break;
			}
		}
	}
	for(i=0;i<len1;i++)  //重新掃描字串1,如果都是在‘\0’,說明二者互為左旋字串,否則不是
	{
		if(arr1[i]!='\0'){
			printf("no");
			break;}
	}
	if(i==len1)
		printf("yes");
	return 0;
}