package zl.character.compare;
/**
* 字符串匹配 kmp算法
* KMP算法实质:利用已经遍历得到的匹配信息来辅助后面的匹配过程
* @author bo
*
*/
public class Kmp {
/**
* next[j] = k 代表索引5的元素直接k-1个元素和开头k-1个元素相匹配(next数组表示 当pj元素失配的时候 需要把模式串向右移动到什么位置)
* 即p0...p(k-1) 和 p(j-k)...p(j-1) 相等
* 所以 0 < k < j
* @param list
* @return
*/
private int[] getNext(char[] list) {
int len = list.length;
int[] next = new int[len+1];
next[0] = -1;
int i = 0;
int j = -1; //代表k
System.out.println("netx[0]=-1");
while(i < (len - 1)) {
if(j == -1 || list[i] == list[j]) {
i++;
j++;
/*
* 当pk 和 pj 相等的时候 p(j+1) 如果不相等 需要移动到p(k+1)上
* 但是,如果p(j+1) = p(k+1) 即使移动也是陪同同一个字符 所以把p(j+1)不匹配问题转移到p(k+1)的元素上
*/
if(list[j] == list[i])
next[i] = next[j];
else
next[i] = j;
System.out.println("next["+i+"]=" + next[i] );
} else
j = next[j];
}
return next;
}
public void kmp(char[] s , char[] m , int[] t) {
int len = s.length;
int number = m.length;
int j = 0;
int i = 0;
while(i < len && j < number) {
if(s[i] == m[j]) {
i++;
j++;
} else {
j = t[j];
if(j == -1) {
j = 0;
i++;
}
}
}
if(j == number) {
System.out.println("匹配位置:" + i);
}
}
/**
* @param args
*/
public static void main(String[] args) {
Kmp kmp = new Kmp();
char[] m = "abababb".toCharArray();
char[] s = "abababababb".toCharArray();
int[] next = kmp.getNext(m);
kmp.kmp(s,m,next);
}
}
/**
* 字符串匹配 kmp算法
* KMP算法实质:利用已经遍历得到的匹配信息来辅助后面的匹配过程
* @author bo
*
*/
public class Kmp {
/**
* next[j] = k 代表索引5的元素直接k-1个元素和开头k-1个元素相匹配(next数组表示 当pj元素失配的时候 需要把模式串向右移动到什么位置)
* 即p0...p(k-1) 和 p(j-k)...p(j-1) 相等
* 所以 0 < k < j
* @param list
* @return
*/
private int[] getNext(char[] list) {
int len = list.length;
int[] next = new int[len+1];
next[0] = -1;
int i = 0;
int j = -1; //代表k
System.out.println("netx[0]=-1");
while(i < (len - 1)) {
if(j == -1 || list[i] == list[j]) {
i++;
j++;
/*
* 当pk 和 pj 相等的时候 p(j+1) 如果不相等 需要移动到p(k+1)上
* 但是,如果p(j+1) = p(k+1) 即使移动也是陪同同一个字符 所以把p(j+1)不匹配问题转移到p(k+1)的元素上
*/
if(list[j] == list[i])
next[i] = next[j];
else
next[i] = j;
System.out.println("next["+i+"]=" + next[i] );
} else
j = next[j];
}
return next;
}
public void kmp(char[] s , char[] m , int[] t) {
int len = s.length;
int number = m.length;
int j = 0;
int i = 0;
while(i < len && j < number) {
if(s[i] == m[j]) {
i++;
j++;
} else {
j = t[j];
if(j == -1) {
j = 0;
i++;
}
}
}
if(j == number) {
System.out.println("匹配位置:" + i);
}
}
/**
* @param args
*/
public static void main(String[] args) {
Kmp kmp = new Kmp();
char[] m = "abababb".toCharArray();
char[] s = "abababababb".toCharArray();
int[] next = kmp.getNext(m);
kmp.kmp(s,m,next);
}
}