1.问题描述:求解模式串在源串中出现的次数
输入
第一行一个整数N,表示测试数据组数。
接下来的N*2行,每两行表示一个测试数据。在每一个测试数据中,第一行为模式串,由不超过10^4个大写字母组成,第二行为原串,由不超过10^6个大写字母组成。
其中N<=20
输出
对于每一个测试数据,按照它们在输入中出现的顺序输出一行Ans,表示模式串在原串中出现的次数。
样例输入
5 HA HAHAHA WQN WQN ADA ADADADA BABABB BABABABABABABABABB DAD ADDAADAADDAAADAAD
样例输出
3 1 3 1 0
2.思路分析:考察的就是KMP算法next数组的求解与使用
代码如下:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String str[] = new String[n*2];
for(int k = 0;k<n*2;k++){
str[k] = sc.next();
}//KMP算法的匹配 先写出一个源串与模式串的字符串匹配的KMP算法再写入到循环中
for(int k = 0;k<n*2;k+=2){
int next[] = next(str[k]);
int i = 0;
int j = 0;
int count = 0;
while(i<str[k+1].length()){
if(j==-1||str[k+1].charAt(i)==str[k].charAt(j)){
i++;
j++;
}else{
j = next[j];
}
if(j==str[k].length()){
count++;
i--;
j = next[j-1];
}
}
System.out.println(count);
}
}
private static int[] next(String p){
int next[] = new int[p.length()];
next[0] = -1;
next[1] = 0;
int j = 1;
int k = 0;
while(j<p.length()-1){
if(k==-1||p.charAt(j)==p.charAt(k)){
next[++j] = ++k;
}else{
k = next[k];
}
}
return next;
}
}