代码来源:程序员代码面试指南
主要是KMP算法的使用,具体请参考程序员代码面试指南P491,有很详细的介绍。
题目,来自牛客网:
题目描述
对于两个字符串A,B。请设计一个高效算法,找到B在A中第一次出现的起始位置。若B未在A中出现,则返回-1。
给定两个字符串A和B,及它们的长度lena和lenb,请返回题目所求的答案。
测试样例:
"acbc",4,"bc",2
返回:2
代码如下:
import java.util.*;
public class StringPattern {
//kmp算法 next算法
public 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;
}
public int findAppearance(String A, int lena, String B, int lenb) {
// write code here
if(A==null||B==null||A.length()<1||A.length()<B.length()){
return -1;
}
char[] As=A.toCharArray();
char[] Bs=B.toCharArray();
int Ai=0;
int Bi=0;
int[] next=getNextArray(Bs);
while(Ai<As.length&&Bi<Bs.length){//核心算法
if(As[Ai]==Bs[Bi]){//相等一直往后移动
Ai++;
Bi++;
}else if(next[Bi]==-1){//不相等,且其next数组为-1,从原字符串下一个字符开始比较
Ai++;
}else{
Bi=next[Bi];//不相等,把Bs往后移动
}
}
return Bi==Bs.length?Ai-Bi:-1;//返回下标
}
}