发现两个字符串是循环的
find that two strings are cyclic
如何在小于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)中的第三个数组。所以,也许最小循环移位解是唯一的。
相关文章:
- 在循环C++中指定字符串之后,不会打印该字符串
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- C++-字符串是否包含一个带有简单循环的单词
- 在 c++ 中查找字符串中没有循环的数字总和
- 比较两个字符串后卡在无限循环中
- C++ - 使用基于范围的 for 循环将字符值分配给向量中的字符串不会分配值
- 而循环跳过 cin.getline() 对于 C 字符串
- 我正在尝试使用 while 循环从字符串中删除字母,直到没有字母。我在这里做错了什么?
- 如何使用将字符串拆分为 for 循环中的变量的程序
- 是否有可能实现O(N)时间和O(1)空间解决方案,以实现C++中的字符串循环移位
- 循环访问还包含未使用元素的字符串数组
- 循环访问资源字符串表
- C++ - 使用用户输入的字符串数据检查结构字符串数据(无限执行 while 循环)
- 修改向量中的字符串?(不使用循环)
- 试图突破字符串循环
- C++和Java的字符串循环性能比较
- 无法通过字符串循环我的程序以将其从英语翻译成猪拉丁语
- C++ 字符串循环检查相同的单词
- 为什么 javascript 中不使用字符串循环的C++语法?