求解模式串在源串中出现的次数

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;
    }
}


 

猜你喜欢

转载自blog.csdn.net/qq_39445165/article/details/82669244