C ++程序 检查两个字符串是否是彼此的旋转体 – 2

C ++程序 检查两个字符串是否是彼此的旋转体 – 2

给定两个字符串s1和s2,检查s2是否是s1的旋转。

示例:

输入:ABACD,CDABA
输出:True

输入:GEEKS,EKSGE
输出:True

我们在早期发布中讨论了一种处理子字符串匹配作为模式的方法。在本帖中,我们将使用 KMP算法的lps (也是后缀最长前缀)构造,它将有助于找到字符串b的前缀和字符串a的后缀最长匹配。从这个点,我们将知道 旋转点 ,从这个点开始匹配字符。如果所有字符都匹配,则是旋转,否则不是。

下面是上述方法的基本实现。

// C++ program to check if 
// two strings are rotations
// of each other
#include<bits/stdc++.h>
using namespace std;
bool isRotation(string a, 
                string b)
{
  int n = a.length();
  int m = b.length();
  if (n != m)
    return false;
  
  // create lps[] that 
  // will hold the longest
  // prefix suffix values 
  // for pattern
  int lps[n];
  
  // length of the previous 
  // longest prefix suffix
  int len = 0;
  int i = 1;
    
  // lps[0] is always 0
  lps[0] = 0; 
  
  // the loop calculates 
  // lps[i] for i = 1 to n-1
  while (i < n) 
  {
    if (a[i] == b[len]) 
    {
      lps[i] = ++len;
      ++i;
    }
    else 
    {
      if (len == 0) 
      {
        lps[i] = 0;
        ++i;
      }
      else 
      {
        len = lps[len - 1];
      }
    }
  }
  
  i = 0;
  
  // Match from that rotating
  // point
  for (int k = lps[n - 1]; 
           k < m; ++k) 
  {
    if (b[k] != a[i++])
      return false;
  }
  return true;
}
  
// Driver code
int main()
{
  string s1 = "ABACD";
  string s2 = "CDABA";
  cout << (isRotation(s1, s2) ? 
           "1" : "0");
}

输出:

1

时间复杂度: O(n)

辅助空间: O(n)

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

C++ 示例