判斷一個字符串是否爲另外一個字符串旋轉之後的字符串。
例如:給定s1 = AABCD和s2 = BCDAA,返回1,給定s1=abcd和s2=ACBD,返回0.
在C語言中判斷一個字符串是否爲另外一個字符串旋轉之後的字符串,可通過好幾種方法實現,今天我們介紹一種最高效的方法——窮舉法。
首先,我們需要分析該題目首先需要滿足該字符串和目標字符串長度需要相等,在長度相等的條件下我們使用malloc()堆空間開闢兩個目標字符串長度的空間。
接着,我們使用庫函數strcpy()將目標字符串複製進開闢的新空間,再通過庫函數strcat()將目標字符串在拼接在其後。
最後,用簡單的邏輯並調用strstr()判斷該字符串是否爲新空間的子串,若是,返回1。若不是,返回0。
原理:
新空間爲兩個目標字符串長度,若目標字符串爲AABCD,則新空間內存的是AABCDAABCD;如果字符串可以通過目標字符串的翻轉得到,則所得到的的字符串必定是新空間內字符串的子串!這便是窮舉法,即將所有可能列出了,最後只需直接查找!不需要再旋轉,效率高。
附:
源代碼:
#include<stdio.h>
#include<assert.h>
#include<string.h>
int FindshiftString(char *str, char *subStr)
{
assert(str); //判斷指針是否合法
assert(subStr);
int len = strlen(str); //測字符串長度
if (len == strlen(subStr)){
char *_str = (char*)malloc(2*len+1); //開闢兩個字符串長度的堆空間
strcpy(_str, str); //將目標字符串複製進新空間 1234abcd
strcat(_str, str); //將目標字符串拼接進新空間 1234abcd1234abcd
if (strstr(_str, subStr) != NULL){
return 1;
}
free(_str); //釋放申請的堆空間
}
return 0;
}
int main()
{
char msg[] = "1234abcd";
char subStr[] = "1234abcd";
printf("%d\n", FindshiftString(msg, subStr));
return 0;
}
上述例子打印出結果爲 1,即可通過目標字符串翻轉得到