给定2个字符串,设计一个函数,可以检查它们是否相互旋转而不对它们进行任何更改?返回值是布尔值。
例如ABCD,ABDC,它们不是旋转。返回错误ABCD,CDAB或DABC是轮换。返回true。
我的解决方案:
将其中一个向右或向左移动一个位置,然后在每次迭代时对它们进行比较。 如果它们在所有迭代中不相等,则返回false。否则,返回true。
是O(n)。还有其他更有效的解决方案吗? 如果它们的内容无法更改怎么办?
谢谢
答案 0 :(得分:5)
将给定字符串与给定字符串连接。
在连接字符串中搜索目标字符串。
示例:
Given = CDAB
After step 1, Concatenated = CDABCDAB
After step 2, Success CDABCDAB
^^^^
答案 1 :(得分:2)
如果你不能修改字符串,只需取string1的第一个字符并将其与string2的每个字符进行比较。当你得到一个匹配项时,将string1的第二个char与string2的下一个char进行比较,依此类推。
伪代码:
len = strlen(string1);
len2 = strlen(string2);
if( len != len2 )
printf("Nope.");
for( int i2=0; i2 < len; i2++ ) {
for( int i1=0; i1<len; i1++ ) {
if( string1[i1] != string2[(i2+i1)%len] )
break;
}
if( i1 == len ) {
print("Yup.");
break;
}
}
答案 2 :(得分:2)
使用两个索引变量可能更有效,而不是移动其中一个。每次从0开始,在另一个可能的位置(0到N-1)开始另一个,并将其递增mod N。
答案 3 :(得分:1)
一个简单的例子是:
(s1+s1).find(s2) != string::npos && s1.size() == s2.size();
答案 4 :(得分:0)
#include <iostream>
#include <cstring>
#include<string>
using namespace std;
void CompareString(string, string, int);
int ComputeStringLength(string str);
int main()
{
string str = ""; string str1 = ""; int len = 0, len1 = 0;
cout << "\nenter string ";
cin >> str;
cout << "\nenter string 2 to compare:- ";
cin >> str1;
len = ComputeStringLength(str);
len1 = ComputeStringLength(str1);
if (len == len1)
CompareString(str, str1, len);
else
cout << "rotation not possible";
getchar();
return 0;
}
int ComputeStringLength(string str)
{
int len = 0;
for (int i = 0; str[i] != '\0'; i++)
{
len++;
}
return len;
}
void CompareString(string str, string str1, int n)
{
int index = 0, flag = 0, curr_index = 0, count1 = 0, flagj = 0;
for (int i = 0; i<n; i++)
{
for (int j = flagj; j<n; j++)
{
if (str[i] == str1[j])
{
index = j;
flagj =j;
count1++;
flag++;
if (flag == 1)
{
curr_index = index;
}
break;
}
}
}
int temp = count1;
if (count1 != n)
{
if (curr_index>=0)
{
int k = 0;
for (int i = n - 1; i>n - curr_index - 1; i--)
{
if (str[i] == str1[k])
{
temp++;
k++;
}
}
}
if (temp == n)
{
cout << "\n\nstring is same after rotation";
}
else
{
cout << "\n\nstring is not same after rotation";
}
}
else
{
cout << "\n\nstring is same after rotation";
}
}
https://dsconceptuals.blogspot.in/2016/10/a-program-to-check-if-strings-are.html