字符串移位包含的问题

在下面的算法中会用到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;
}

该算法大大下降了时间复杂的,可是空间复杂度却提升了,若是字符串很长很长,会占用很大的空间。



参考书籍:《编程之美》

相关文章
相关标签/搜索