模拟算法题目
旋转词
题目解析: KMP算法应用
import java.util.Scanner;
//模拟-旋转词
public class Main {
public static class KMP{
public String s1;
public String s2;//目标串
public int next[];
public KMP(String s1,String s2) {
this.s1=s1;
this.s2=s2;
if(s2.length()>0)next=new int[s2.length()];
}
public void getNextArray() {
if(s2.length()==1) {
next[0]=-1;
return;
}
next[0]=-1;
next[1]=0;
int i=2;
int cn=0;//从0开始与s2[i-1]比对
while(i<s2.length()) {
if(s2.charAt(next[i-1])==s2.charAt(cn)) {
next[i++]=++cn;
}else if(cn>0) {
cn=next[cn];
}else {//cn<=0
++i;
}
}
}
public int getIndexOf() {
if(s2.length()>s1.length()) {
return -1;
}
getNextArray();
int x=0;
int y=0;
while(x<s1.length()&&y<s2.length()) {
if(s1.charAt(x)==s2.charAt(y)) {
x++;
y++;
}
else if(next[y]==-1) {
x++;
}else {
y=next[y];
}
}
return y==s2.length()?x-y:-1;
}
}
public static boolean isRotateWord(String s1,String s2) {
if(s1.length()!=s2.length())return false;
s1+=s1;
//KMP判断s2是否是s1的字串
KMP kmp=new KMP(s1,s2);
return kmp.getIndexOf()!=-1?true:false;
}
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int n,m;
n=scan.nextInt();
m=scan.nextInt();
scan.nextLine();
String s1,s2;
s1=scan.nextLine();
s2=scan.nextLine();
boolean ans=isRotateWord(s1,s2);
if(ans)System.out.println("YES");
else System.out.println("NO");
}
}