字符串移位包含的問題

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

該算法大大下降了時間複雜的,可是空間複雜度卻提升了,若是字符串很長很長,會佔用很大的空間。



參考書籍:《編程之美》

相關文章
相關標籤/搜索