判斷一個字串是否為另外一個字串旋轉之後的字串。 例如:給定s1 = AABCD和s2 = BCDAA,返回1,給定s1=abcd和s2=ACBD,返回
阿新 • • 發佈:2018-12-24
判斷一個字串是否為另外一個字串旋轉之後的字串。例如:給定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; }