如何检查2个字符串是否相互旋转?

时间:2011-10-25 20:59:20

标签: c++ string algorithm comparison rotation

给定2个字符串,设计一个函数,可以检查它们是否相互旋转而不对它们进行任何更改?返回值是布尔值。

例如ABCD,ABDC,它们不是旋转。返回错误

ABCD,CDAB或DABC是轮换。返回true。

我的解决方案:

将其中一个向右或向左移动一个位置,然后在每次迭代时对它们进行比较。 如果它们在所有迭代中不相等,则返回false。否则,返回true。

是O(n)。还有其他更有效的解决方案吗? 如果它们的内容无法更改怎么办?

谢谢

5 个答案:

答案 0 :(得分:5)

  1. 将给定字符串与给定字符串连接。

  2. 在连接字符串中搜索目标字符串。

  3. 示例:

    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