发现两个字符串是循环的

find that two strings are cyclic

本文关键字:字符串 循环 两个 发现      更新时间:2023-10-16

如何在小于O(n^2)中找到两个字符串是否循环,而不使用第三个数组
输入
str1="abcde"str="eabcd"
输出
循环
输入
str1="cabdc"str="ccabd"
输出
循环
输入
str1="ddabnhdd"str="dddabnhd"
输出
循环

请给我建议最好的解决方案???

您需要进行优化的字符串搜索,有些字符串需要O(n) + O(m),您可以在这里找到它们
之后,只需将第一个字符串加倍并搜索其中的第二个字符串,就需要O(n)时间
为了避免使用第三个数组,只需对第一个字符串进行每次访问。

答案应该是:最小循环移位

该算法花费O(n)时间,并且根本没有额外的数组,并且它找到单词的最小循环移位。

使用它,我们可以很容易地检查:

int a=minLexCyc(str1),b=minLexCyc(str2),i,n=strlen(str1);
for(i=0;i<n;i++){
        if(str1[(a+i)%n]!=str2[(b+i)%n]){
                cout<< "not cyclic";
                return ;
        }
}
cout<< "cyclic";

PS:我认为任何包含搜索字符串部分的解决方案都不能满足的要求,而不使用O(n)中的第三个数组。所以,也许最小循环移位解是唯一的。