题目:
思路:
这个题首先需要判断两个字符串的长度,如果长度不相等的话直接返回false.接着创造一个新的字符串b1,是的b1=b+b。接着判断在新的字符串b1中是否包含有字符串a,这里使用的是KMP算法。这个算法我还不太懂。。。。先把左神的相关代码都写在下面。整个算法的时间复杂度是o(n),n是a,b字符串的长度。
这个下午清醒了看。。。。。这个还是有点不理解。。。。
代码:
import java.util.*;
public class zcy1 {
public static void main(String[]args){
Scanner sc=new Scanner(System.in);
String a=sc.next();
String b=sc.next();
if( (a.length()!=b.length())){
System.out.println(false);
}
else{
String b1=b+b;
//如果b1中含有字符串a,返回在b1中的下标
int index=getIndex(b1,a);
System.out.println(index!=-1);
}
}
public static int getIndex(String s,String m){
//其中s是大的字符串,,m是比较小的那个字符串
if(s==null||m==null||m.length()<1||s.length()<m.length()){
return -1;
}
char[]ss=s.toCharArray();
char[]ms=m.toCharArray();
int si=0;
int mi=0;
//创建ms对应的next数组
int[]next=getNextArray(ms);
while(si<ss.length&&mi<ms.length){
if(ss[si]==ms[mi]){
si++;
mi++;
}
else if(next[mi]==-1){
si++;
}
else{
mi=next[mi];
}
}
return mi==ms.length?si-mi:-1;
}
public static int[] getNextArray(char[]ms){
if(ms.length==1){
return new int[]{-1};
}
int []next=new int [ms.length];
next[0]=-1;
next[1]=0;
int pos=2;
int cn=0;
while(pos<next.length){
if(ms[pos-1]==ms[cn]){
next[pos++]=++cn;
}
else if(cn>0){
cn=next[cn];
}
else{
next[pos++]=0;
}
}
return next;
}
}