概述:
如果把一个字符串S的前面任意个字符放到S的后面,所形成的新字串叫做S的旋转词。
例如:ABCD和CDAB,1357和7135
思路:
如果字符串a2能被a1通过旋转得到,则a2一定是a1a1(两个a1拼接起来)的子串,新创建一个字符串a3,a3的内容等于两个a1拼接起来,再判断a2是否为a3的子串。
如:a1="ABCD",a2="CDAB",则a3="ABCDABCD",只需判断a2是否为a3的子串!
若果a2是a3的子串,则互为旋转词;否则不互为旋转词。
判断是否为子串可使用KMP算法实现!
代码:
#include <iostream>
#include <cstring>
#define SIZE 50
using namespace std;
int getNext(char a2[],int next[]){ //next数组的实现
next[0]=-1;
int i=0,j=-1;
int len=strlen(a2);
while(i<len){
if(j==-1||a2[i]==a2[j]){
i++;
j++;
next[i]=j;
}
else{
j=next[j];
}
}
}
int KMP(char a3[],char a2[],int next[]){//KMP算法查找
int i=0,j=0;
int a3_len=strlen(a3);
int a2_len=strlen(a2);
while(i<a3_len&&j<a2_len){
if(j==-1||a3[i]==a2[j]){
i++;
j++;
}
else{
j=next[j];
}
}
if(j==a2_len)
return i-j;
else
return -1;
}
int main(){
char a1[SIZE];
char a2[SIZE];
cout<<"请输入第一个字符串:";
cin>>a1;
cout<<"请输入第二个字符串:";
cin>>a2;
int next[SIZE];
int len1=strlen(a1);
int len2=strlen(a2);
int len3=2*strlen(a1);
char a3[len3];
int x;
strcpy(a3,a1); //将a1赋值给a3
strcat(a3,a1); //将a1拼接到a3末尾,(调用strcat函数后,此时的a3即为2个a1)
//上两行代码即实现了两个a1的拼接
getNext(a2,next);
x=KMP(a3,a2,next);
if(x==-1){
cout<<"不互为旋转词";
}
else{
cout<<"互为旋转词";
}
}