在下面的算法中会用到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; }
该算法大大下降了时间复杂的,可是空间复杂度却提升了,若是字符串很长很长,会占用很大的空间。
参考书籍:《编程之美》