KMP算法
代码如下:
import java.util.Arrays;
/**
* KMP算法
* @author yangj0020
*
*/
public class KMP {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s = "abcaabbabcabaacbacba";
String t = "abcabaa";
int index = KMPIndex(s, t);
System.out.println(index);
}
/**
*
* @param t 模式串
* @param next next数组
*/
static void getNext(String t, int[] next) {
int j = 0; //用于遍历字符串
int k = -1; //记录t[j]之前与t开头相同的字符个数
next[0] = -1;
while(j < t.length() - 1) {
if(k == -1 || t.charAt(j) == t.charAt(k)) {
j++; k++;
next[j] = k;
} else {
k = next[k];
}
}
}
/**
*
* @param s 目标串
* @param t 模式串
* @return
*/
static int KMPIndex(String s, String t) {
int[] next = new int[t.length()];
getNext(t, next);
System.out.println(Arrays.toString(next));
int i = 0, j =0;
while(i < s.length() && j < t.length()) {
if(j == -1 || s.charAt(i) == t.charAt(j)) {
i++; j++;
} else {
j = next[j];
}
}
if(j >= t.length()) { //匹配成功
return i - t.length();
} else {
return -1;
}
}
}
改进后的KMP算法
代码如下:
import java.util.Arrays;
/**
* 改进后的KMP算法
* @author yangj0020
*
*/
public class KMP {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s = "abcaabbabcabaacbacba";
String t = "abcabaa";
int index = KMPIndex(s, t);
System.out.println(index);
}
/**
*
* @param t 模式串
* @param nextVal nextVal数组
*/
static void getNextVal(String t, int[] nextVal) {
int j = 0; //用于遍历字符串
int k = -1; //记录t[j]之前与t开头相同的字符个数
nextVal[0] = -1;
while(j < t.length() - 1) {
if(k == -1 || t.charAt(j) == t.charAt(k)) {
j++; k++;
if(t.charAt(j) != t.charAt(k)) {
nextVal[j] = k;
} else {
nextVal[j] = nextVal[k];
}
} else {
k = nextVal[k];
}
}
}
/**
*
* @param s 目标串
* @param t 模式串
* @return
*/
static int KMPIndex(String s, String t) {
int[] nextVal = new int[t.length()];
getNextVal(t, nextVal);
System.out.println(Arrays.toString(nextVal));
int i = 0, j =0;
while(i < s.length() && j < t.length()) {
if(j == -1 || s.charAt(i) == t.charAt(j)) {
i++; j++;
} else {
j = nextVal[j];
}
}
if(j >= t.length()) { //匹配成功
return i - t.length();
} else {
return -1;
}
}
}