BF和KMP算法(模式匹配)
模式匹配也称串匹配,或子串查找。用于在某文本中查找某特定的子串,其中,文本称为正文串,而要查找的内容称为模式串。通常正文是一个“大串”,而模式串只是一个“小串”。
设“a0a1…am-1”是长度为m的正文串,"p0p1…pn "是长度为n的模式串,且m≥n。模式匹配的含义是,求出最小的下标i=index(a,p)使得:aiai+1…ai+n-1=p0p1…p{n-1}。即在串a中寻找“最早发现的”子串p。如果a中不存在子串p,则返回无效地址-1。
BF算法
import java.util.Scanner;
public class BF {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String text = scanner.nextLine();
String pattern = scanner.nextLine();
int start = strstr(text.toCharArray(), pattern.toCharArray());
if (start == -1) {
System.out.println("匹配失败");
} else {
System.out.println(text.substring(start, start + pattern.length()));
}
}
public static int strstr(char[] text, char[] pattern) {
for (int i = 0; i < text.length - pattern.length; i++) {
int j = 0, k = i;
for (; j < pattern.length; j++, k++) {
if (text[k] != pattern[j]) {
break;
}
}
if (j == pattern.length)
return i;
}
return -1;
}
}
KMP算法
import java.util.Scanner;
public class KMP {
static int[] patternFail;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
String text = scanner.nextLine();
String pattern = scanner.nextLine();
int n = pattern.length();
patternFail = new int[n + 1];
getPatternFail(pattern.toCharArray(), n);
int start = strstr(text.toCharArray(), pattern.toCharArray(), n);
String result = text.substring(start, start + pattern.length());
System.out.println(result);
}
public static int strstr(char[] text, char[] pattern, int n) {
int k, j;
k = j = 0; //正文串指针k和模式串指针j的初值
while (k < text.length && j < pattern.length) { //当正文串和模式串都未测试完时循环
if (j == -1) { //若j推到头,k右移,j=0
k++;
j++;
continue;
}
if (text[k] == pattern[j]) { //若相配,k和j右移,继续本轮试匹配
k++;
j++;
continue;
}
j = patternFail[j]; //若失配,k不变,j回退
}
if (j < pattern.length)
return -1; //匹配失败
return k - pattern.length; //匹配成功
}
public static void getPatternFail(char[] pattern, int n) { //计算失配函数表
int k = 0, j;
j = patternFail[0] = -1;
while (k < n) {
if (j == -1) {
j++;
k++;
patternFail[k] = 0;
continue;
}
if (pattern[k] == pattern[j]) {
j++;
k++;
patternFail[k] = j;
continue;
}
j = patternFail[j];
}
}
}