как проверить, являются ли 2 строки вращениями друг к другу? - PullRequest
2 голосов
/ 26 октября 2011

Учитывая 2 строки, спроектируйте функцию, которая может проверять, являются ли они вращениями друг к другу, не внося в них изменений?Возвращаемое значение логическое.

Например, ABCD, ABDC, они не являются вращениями.return false

ABCD, CDAB или DABC - это вращения.верните true.

Мое решение:

переместите одну из них вправо или влево на одну позицию, а затем сравнивайте их на каждой итерации.Если они не равны на всех итерациях, вернуть false.В противном случае верните true.

Это O (n).Есть ли другие более эффективные решения?Что если их содержимое не может быть изменено?

спасибо

Ответы [ 5 ]

5 голосов
/ 26 октября 2011
  1. Объединить данную строку с данной строкой.

  2. Поиск целевой строки в объединенной строке.

Пример:

Given = CDAB

After step 1, Concatenated = CDABCDAB

After step 2, Success CDABCDAB
                        ^^^^
2 голосов
/ 26 октября 2011

Вместо смещения одной из них может быть более эффективно использовать две индексные переменные.Начните один с 0 каждый раз, а другой с каждой из возможных позиций (от 0 до N-1) и увеличивайте его mod N .

2 голосов
/ 26 октября 2011

Если вы не можете изменить строки, просто возьмите первый символ строки1 и сравните его с каждым символом строки2. Когда вы получите совпадение, сравните второй символ строки1 со следующим символом строки2 и т. Д.

псевдокод:

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;
  }
}
1 голос
/ 26 октября 2011

Простой будет:

(s1+s1).find(s2) != string::npos && s1.size() == s2.size();
0 голосов
/ 04 октября 2016
  #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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...