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

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

判斷一個字串是否為另外一個字串旋轉之後的字串。  例如:給定s1 =AABCD和s2 = BCDAA,返回1,給定s1=abcd和s2=ACBD,返回0.  AABCD左旋一個字元得到ABCDA  AABCD左旋兩個字元得到BCDAA  AABCD右旋一個字元得到DAABC 

方法1:

     left_rotate:每次左旋依次,判斷旋轉之後的字串與目標字串是否一致,如果左旋了strlen(str)次,仍然沒有找到,返回0

方法2:

     把目標串拼接相同的內容,判斷源串是否為目標的子串,如果是,目標串肯定是源串旋轉之後的內容

     dest    ----->abcd      src  ------>cdab      拼接後   abcdab

cd

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void  reverse(char* start, char* end){
	while (start < end){
		char temp = *start;
		*start = *end;
		*end = temp;
		start++;
		end--;
	}
}
void  left_rotate(char * str, int k){
	int  len = strlen(str);
	//旋轉前k個字元
	reverse(str, str + k - 1);
	//旋轉剩餘的字串
	reverse(str + k, str + len - 1);
	//旋轉整體
	reverse(str, str + len - 1);
}
int is_rotate(char* dest, char* src){
	if (strlen(dest) != strlen(src)){
		return 0;
	}
	if (!strcmp(dest, src)){
		return 1;
	}
	int  k = strlen(dest);
	k--;
	while (k--){
		//每次旋轉一次
		left_rotate(src, 1);
		//判斷旋轉之後的內容是否和目標一致
		if (! strcmp(dest, src)){
			return 1;
		}
	}
	return  0;
}
int  main(){
	char dest[100];
	char src[100];
	scanf("%s", &dest);
	scanf("%s", &src);
	printf("%d\n", is_rotate(dest,src));
	system("pause");
	return 0;
}