在下面的算法中會用到strstr函數,在C語言裏有這個函數的介紹。算法
思路一編程
找出字符串s1全部循環移位獲得的字符串,看是否有字符串包含s2函數
void rotate(char * s) { int len=strlen(s); char temp=s[0]; for(int j = 0;j<len-1;j++) { s[j]=s[j+1]; } s[j]=temp; printf("%s\n",s); } bool exists(char *s1, char *s2) { int len = strlen(s1); //作len-1次移位,最後回到原來的數據 for(int i = 0;i<len;i++) { rotate(s1); if(strstr(s1,s2)) return true; } return false; }
若是字符串s1很長,那麼該算法效率很低code
思路二字符串
若是字符串爲s1,那麼s1s1確定包含了全部s1循環移位的字符串。class
例如ABCD->BCDA->CDAB->DABC爲全部ABCD循環移位的字符串效率
ABCDABCD顯然包括了以上全部的字符串書籍
那麼咱們只需獲得s1s1,只使用一次strstr函數即可解出循環
看代碼數據
bool exists(char *s1, char *s2) { char * temp1 = s1; int len = strlen(s1); char * const s = (char *)malloc(sizeof(char)*(2*len+1)); char * temp2 = (char *)s; //如下生成s1s1字符串 while(*temp1) (*temp2++)=(*temp1++); temp1=s1; while((*temp2++) =(*temp1++)); bool exist = strstr(s,s2); free(s); return exist; }
該算法大大下降了時間複雜的,可是空間複雜度卻提升了,若是字符串很長很長,會佔用很大的空間。
參考書籍:《編程之美》