next數組的求解:
求next數組的方法與這位大佬一樣,感興趣的同學自己去看吧。--->next數組的求解過程
代碼實現:
直接上根據這個方法我寫的kmp
package suanfaTest;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class KMP01 {
public static int i=0,j=0;
public static int[] kmpNext(String ps){//Next數組
List<Integer> nxt = new ArrayList<Integer>();
int[] a = new int[ps.length()];//Next數組的長度爲模板串的長度
int len = ps.length();
if (len == 0){
return null;
}else if (len == 1){
nxt.add(0);
for (int i=0; i<nxt.size(); i++)
{
a[i] = nxt.get(i);
}
return a;
}else if (len == 2){
nxt.add(0);
nxt.add(1);
for (int i=0; i<nxt.size(); i++)
{
a[i] = nxt.get(i);
}
return a;
}
char[] p = ps.toCharArray();//將模式串轉換爲模式數組
nxt.add(0);
nxt.add(1);
for (int i=2; i<p.length; i++){//採用由next(i-1)求next(i)的方法
int k = nxt.get(i-1);
while (k!=0){//當nxt.get(i-1)等於0時,代表已經回溯到了next數組的第一個元素
if (p[i-1] == p[k-1]){//因爲數組是從0開始計數的,所以這裏需要k-1
nxt.add(k+1);
break;
}else {
k = nxt.get(k-1);//p[k-1]與nxt.get(k-1)相對應
}
}
if (k==0){
nxt.add(1);
}
}
for (int i=0; i<nxt.size(); i++)
{
a[i] = nxt.get(i);
}
return a;
}
public static Boolean KMP(String a,String b){
int[] nxt = kmpNext(b);
while (i<a.length()&&j<b.length()){
if (a.charAt(i) == b.charAt(j)){//如果比較的兩位都相等的話,i++,j++
i++;
j++;
}else if (j==0 &&a.charAt(i) != b.charAt(j)){//如果j=0,代表指向模式串的第一個元素,此時若比較的兩個元素不相等的話,則i++,j無需++
i++;
}else {
j=nxt[j-1];//因爲我們的next數組下標是從0開始,所以這個地方是j-1,不然就是一個死循環
}
}
if (j == b.length())
return true;
else
return false;
}
public static void main(String args[]){
String a = "hshabbbc";
String b = "abbc";
KMP01 kmp = new KMP01();
System.out.println(kmp.KMP(a,b));
}
}