DS串应用--KMP算法
kmp忘得差不多了,感觉不会考,用之前看到的一个师姐的代码(原博客写得很详细,地址贴下面了),改了下,A了先,后续再把详细的思想过程记录下来。(之前研究了好久)
题目描述
学习KMP算法,给出主串和模式串,求模式串在主串的位置
算法框架如下,仅供参考
输入
第一个输入t,表示有t个实例
第二行输入第1个实例的主串,第三行输入第1个实例的模式串
以此类推
输出
第一行输出第1个实例的模式串的next值
第二行输出第1个实例的匹配位置,位置从1开始计算,如果匹配成功输出位置,匹配失败输出0
以此类推
样例输入
3
qwertyuiop
tyu
aabbccdd
ccc
aaaabababac
abac
样例输出
-1 0 0
5
-1 0 1
0
-1 0 0 1
8
提示
为什么next值和课本的不一样???
Solution:
import java.util.*;
/**
* @author: Liu Canbin
* @date: 2019/1/4
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
for (int i = 0; i < n; i++) {
String s = scanner.next();
String t = scanner.next();
int[] next = getNext(t);
for (int j = 0; j < next.length; j++) {
System.out.print(next[j]+" ");
}
System.out.println();
System.out.println(kmp(s,t)+1);
}
}
static int kmp(String s,String t){
int i,j;
int[] next = getNext(t);
for (i = 0,j=0; i< s.length() && j<t.length();) {
if (j==-1 || s.charAt(i) == t.charAt(j)){
i++;j++;
}else {
j = next[j];
}
}
if (j == t.length()){
return i-j;
}
return -1;
}
static int[] getNext(String s){
int j=0,k=-1;
int[] next = new int[s.length()];
next[j] = k;//初始值
while (j<(s.length()-1)){
if (k == -1 || s.charAt(j) == s.charAt(k)){
next[++j] = ++k;
}else {
k = next[k];
}
}
return next;
}
}
代码思想来源:https://blog.csdn.net/mofushaohua_ln/article/details/78238520