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)