如何找到两个字符串是否是循环的,小于 O(n ^ 2)和而不使用第三个数组。
输入
str1 =“abcde”str =“eabcd”
输出
周期
输入
str1 =“cabdc”str =“ccabd”
输出
周期
输入
str1 =“ddabnhdd”str =“dddabnhd”
输出
循环
请建议我最好的解决方案???
答案 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)的即可。因此,最小循环移位解决方案可能是唯一的解决方案。