• 831. KMP字符串(模板)


    给定一个模式串S,以及一个模板串P,所有字符串中只包含大小写英文字母以及阿拉伯数字。

    模板串P在模式串S中多次作为子串出现。

    求出模板串P在模式串S中所有出现的位置的起始下标。

    输入格式

    第一行输入整数N,表示字符串P的长度。

    第二行输入字符串P。

    第三行输入整数M,表示字符串S的长度。

    第四行输入字符串S。

    输出格式

    共一行,输出所有出现位置的起始下标(下标从0开始计数),整数之间用空格隔开。

    数据范围

    1N1041≤N≤104
    1M1051≤M≤105

    输入样例:

    3
    aba
    5
    ababa
    

    输出样例:

    0 2

    ne[i]的含义:对于子串,最长相同前缀和后缀的长度 
    eg:
    abaacdffgab ne[i] 0 0 1 1 0 0 0 0 0 1 2
    代码:
    import java.util.Scanner;
    
    public class Main{
            static int m,n;//n为子串,m为父串
            static int ne[]=new int[10005];
            static char p[]=new char[10005];
             static char s[]=new char[100005];
            static void get_next(){
                    for(int i=2,j=0;i<=n;i++){//i从2开始,如果i=1就不匹配,那么ne[1]=0
                            while(j>0 &&p[i]!=p[j+1]) j=ne[j];
                            if(p[i]==p[j+1]) j++;
                            ne[i]=j;
                    }
            }
            static void kmp(){
                    for(int i=1,j=0;i<=m;i++){
                        while(j>0 && s[i]!=p[j+1]) j=ne[j];
                        if(s[i]==p[j+1]) j++;
                        if(j==n){
                            System.out.print((i-n)+" ");
                            j=ne[j];
                        }
                    }
            }
            public static void main(String[] args) {
                     Scanner scan=new Scanner(System.in);
                     n=scan.nextInt();
                     String sn=scan.next();
                     m=scan.nextInt();
                     String sm=scan.next();
                     for(int i=1;i<=n;i++) p[i]=sn.charAt(i-1);//子串
                     for(int i=1;i<=m;i++) s[i]=sm.charAt(i-1);//父串
                     get_next();
                     kmp();    
            }
    }
  • 相关阅读:
    3.数据库分类
    2.Oracle数据库安装教程
    1.Oracle数据库简介
    MySQL最全存储引擎、索引使用及SQL优化的实践
    大数据各个工具随笔
    初入Shell
    第4章 DDL数据定义
    第3章 Hive数据类型
    第2章 Hive安装
    MySQL 创建数据库
  • 原文地址:https://www.cnblogs.com/qdu-lkc/p/12229505.html
Copyright © 2020-2023  润新知