发现两个字符串是循环的

时间:2012-08-04 15:40:28

标签: c++ c algorithm

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

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

2 个答案:

答案 0 :(得分:4)

您需要进行优化的字符串搜索,其中包含O(n) + O(m),您可以找到它们here
之后,只需将第一个字符串加倍并搜索其中的第二个字符串,就需要O(n)次 为避免使用第三个数组,只需对第一个字符串模块进行每次访问即可。

答案 1 :(得分:3)

答案应该是:minimal-cyclic-shift

该算法花费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)的即可。因此,最小循环移位解决方案可能是唯一的解决方案。

相关问题