public class Main {
public int[] findNext(String str) {
int[] next = new int[str.length()];
char[] c = str.toCharArray();
next[0] = 0;
if(str.length() == 1)
return next;
else {
for(int i=1; i< c.length; i++) {
int tmp = next[i-1];
if(c[tmp] == c[i])
next[i] = next[i-1] + 1;
else {
if(c[0] == c[i])
next[i] = 1;
else
next[i] = 0;
}
}
return next;
}
}
public int KMP(String A,String B) {
if(A.length() < B.length())
return -1;
int[] next = findNext(B);
int s1 = 0;
int s2 = 0;
char[] a = A.toCharArray();
char[] b = B.toCharArray();
while(s1 < A.length()) {
while(s2 < B.length() && a[s1] == b[s2]){
s1++;
s2++;
}
if(s2 == B.length())
return s1-B.length();
if(s2 == 0) {
s1++;
s2++;
}
else {
int key = next[s2-1];
s1 = s1 - key;
s2 = key;
}
}
return 0;
}
public static void main(String[] args) {
Main m = new Main();
String A = "aaccaaccaa";
String B = "aaccaa";
int s = m.KMP(A, B);
System.out.println(B);
System.out.println("================");
int l = A.length();
char[] a = A.toCharArray();
System.out.print(s+":");
for(int i=s; i < s+B.length(); i++)
System.out.print(a[i]);
}
}
字符串匹配问题——KMP算法实现
最新推荐文章于 2022-06-27 17:34:09 发布