问题描述
提示:这道题就是去实验书上的三种字符串匹配算法:
输入字符串和匹配模式,输出匹配的下标。
难点分析:
提示:这里我建议直接抄书,书上那个KMP真的太好了,真的优雅
public static int match(String text, String pattern) {
int[] fail = getFilure(pattern);
int i = 0;
int k = 0;
while (i < text.length()) {
if (text.charAt(i) == pattern.charAt(k)) {
if (k == pattern.length() - 1) {
return i - pattern.length() + 1;
}
i++;
k++;
} else {
if (k > 0) {
k = fail[k - 1];
} else {
i++;
}
}
}
return -1;
}
public static int[] getFilure(String pattern) {
int[] fail = new int[pattern.length()];
int i = 1;
int k = 0;
while (i < pattern.length()) {
if (pattern.charAt(i) == pattern.charAt(k)) {
i++;
k++;
} else if (k > 0) {
k = fail[k - 1];
} else {
i++;
}
}
return fail;
}
}
代码:
public class Lab22_3 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("Enter a string: ");
String a = in.nextLine();
System.out.print("Enter a string: ");
String b = in.nextLine();
int index = match(a, b);
if (index >= 0) {
System.out.println("match at index " + index);
} else
System.out.println("unmatched");
}
public static int match(String text, String pattern) {
int[] fail = getFilure(pattern);
int i = 0;
int k = 0;
while (i < text.length()) {
if (text.charAt(i) == pattern.charAt(k)) {
if (k == pattern.length() - 1) {
return i - pattern.length() + 1;
}
i++;
k++;
} else {
if (k > 0) {
k = fail[k - 1];
} else {
i++;
}
}
}
return -1;
}
public static int[] getFilure(String pattern) {
int[] fail = new int[pattern.length()];
int i = 1;
int k = 0;
while (i < pattern.length()) {
if (pattern.charAt(i) == pattern.charAt(k)) {
i++;
k++;
} else if (k > 0) {
k = fail[k - 1];
} else {
i++;
}
}
return fail;
}
}