在下面的算法中会用到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很长,那么该算法效率很低
思路二
如果字符串为s1,那么s1s1肯定包含了所有s1循环移位的字符串。
例如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;
}
该算法大大降低了时间复杂的,但是空间复杂度却提高了,如果字符串很长很长,会占用很大的空间。
参考书籍:《编程之美》