您的位置:首页 > 编程语言 > Java开发

KMP Matching: String Matching

2015-05-19 07:39 295 查看

KMP matching:





Pseudo code:





Java code:

/**
* Created with IntelliJ IDEA.
* User: 1O1O
* Date: 2015-03-31
* Time: 12:01 PM
* :)~
* KMP-MATCH:STRING-MATCH
*/
public class Main {
public static int[] COMPUTE_PREFIX_FUNCTION(String P_sub){
int m = P_sub.length();
char[] P_sub_char = P_sub.toCharArray();
int[] pie = new int[m];
pie[0] = 0;
int k = 0;
for(int q=2; q<=m; q++){
while (k>0 && P_sub_char[k]!=P_sub_char[q-1]){
k = pie[k];
}
if(P_sub_char[k] == P_sub_char[q-1]){
k = k+1;
}
pie[q-1] = k;
}
System.out.println("Prefix results: ");
for(int r=0; r<m; r++){
System.out.println("Pie["+r+"]="+pie[r]);
}
return pie;
}

public static void KMP_MATCHER(String T_full, String P_sub){
int n = T_full.length();
int m = P_sub.length();
char[] T_full_char = T_full.toCharArray();
char[] P_sub_char = P_sub.toCharArray();
int[] pie = COMPUTE_PREFIX_FUNCTION(P_sub);
int q = 0;
for(int i=1; i<=n; i++){
while (q>0 && P_sub_char[q]!=T_full_char[i-1]){
q = pie[q-1];
}
if(P_sub_char[q]==T_full_char[i-1]){
q = q+1;
}
if(q == m){
System.out.println("Pattern occurs with shift: "+(i-m+1));
q = pie[q-1];
}
}
}

public static void main(String[] args) {
String T_full = "bacbababaabcbabababacababbababacabbc";
String P_sub = "ababaca";
KMP_MATCHER(T_full, P_sub);
}
}


Output:

Prefix results:
Pie[0]=0
Pie[1]=0
Pie[2]=1
Pie[3]=2
Pie[4]=3
Pie[5]=0
Pie[6]=1
Pattern occurs with shift: 16
Pattern occurs with shift: 27


Reference:

From: 《INTRODUCTION TO ALGORITHMS》THIRD EDITION.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息