831. KMP字符串(模板)

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

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

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

输入格式

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

第二行输入字符串P。

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

第四行输入字符串S。

输出格式

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

数据范围

1≤N≤1041≤N≤104
1≤M≤1051≤M≤105

输入样例:

3
aba
5
ababa

输出样例:

0 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();
        }
}

原文地址:https://www.cnblogs.com/qdu-lkc/p/12229505.html

时间: 2024-08-06 21:10:24

831. KMP字符串(模板)的相关文章

AcWing 831. KMP字符串

https://www.acwing.com/problem/content/833/ #include <iostream> using namespace std; const int N = 10010, M = 100010; int n, m; int ne[N]; char s[M], p[N]; int main() { cin >> n >> p + 1 >> m >> s + 1; //求next过程 //i从2开始,因为nex

hdu 1711 KMP算法模板题

题意:给你两个串,问你第二个串是从第一个串的什么位置開始全然匹配的? kmp裸题,复杂度O(n+m). 当一个字符串以0为起始下标时.next[i]能够描写叙述为"不为自身的最大首尾反复子串长度". 当发生失配的情况下,j的新值next[j]取决于模式串中T[0 ~ j-1]中前缀和后缀相等部分的长度, 而且next[j]恰好等于这个最大长度. 防止超时.注意一些细节.. 另外:尽量少用strlen.变量记录下来使用比較好,用字符数组而不用string //KMP算法模板题 //hdu

KMP超强模板贴一份

while(scanf("%s",str+1)==1 ) {        int n=strlen(str+1);        next[1]=0; int j=0;        for(int i=2;i<=n;i++) {            while(j&&str[j+1]!=str[i]) j=next[j];            if(str[i]==str[j+1]) j++;            next[i]=j;        } 

KMP字符串

给定一个模式串S,以及一个模板串P,所有字符串中只包含大小写英文字母以及阿拉伯数字. 模板串P在模式串S中多次作为子串出现. 求出模板串P在模式串S中所有出现的位置的起始下标. 输入格式 第一行输入整数N,表示字符串P的长度. 第二行输入字符串P. 第三行输入整数M,表示字符串S的长度. 第四行输入字符串S. 输出格式 共一行,输出所有出现位置的起始下标(下标从0开始计数),整数之间用空格隔开. 数据范围 1≤N≤1041≤N≤1041≤M≤1051≤M≤105 输入样例: 3 aba 5 ab

KMP字符串模式匹配详解

KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法.简单匹配算法的时间复杂度为O(m*n);KMP匹配算法.可以证明它的时间复杂度为O(m+n).. 一.简单匹配算法 先来看一个简单匹配算法的函数: int Index_BF ( char S [ ], char T [ ], int pos ) { /* 若串 S 中从第pos(S 的下标0≤pos个字符 起存在和串 T 相同的子串,则称匹配成功,返回第一个 这样的子串在串 S 中的下标,否则返回 -1    */ int

【Java】字符串模板替换

原文:[Java]字符串模板替换 源代码下载地址:http://www.zuidaima.com/share/1593989887085568.htm 自己封装的工具类中的一个小方法. String str = "大象说它会{0}死,蚂蚁说它会{0}死"; template(str,"胖", "瘦"); 输出: 大象说它会胖死,蚂蚁说它会瘦死 代码请下载. 可以用一些模板语言实现,不过这个代码很好的诠释了模板的机制,赞一个. 参考如下代码: 自己

KMP字符串匹配算法及next前缀数组的应用

#KMP字符串匹配算法及next前缀数组的应用------ KMP算法通常是我们学习字符串匹配算法时遇见的第一个算法,另外还有Rabin-Karp, Sunday算法等. 相对于其他字符串匹配算法, kmp在字符串中字符重复率低的情况下并不具备优势,那为什么KMP算法会作为经典的教学算法呢? 原因可能是:KMP算法充分利用next前缀数组的信息来优化算法,减小时间复杂度的思路在很多字符串相关问题中能给我们启发. 首先上KMP字符串匹配算法, [leetcode在线测试地址](https://le

Python - 字符串模板的安全替换(safe_substitute) 具体解释

字符串模板的安全替换(safe_substitute) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27057339 字符串模板(sting.Template), 替换时, 使用substitute(), 未能提供模板所需的所有參数值时, 会发生异常. 假设使用safe_substitute(), 即安全替换, 则会替换存在的字典值, 保留未存在的替换符号. 代码: # -*- coding: utf-8 -*-

Kotlin字符串模板

Kotlin提供了一种字符串模板,字符串模板可以包含模板表达式,即一小段代码 字符串模板会计算值并把结果合并到字符串中,它以$开头 很多时候我们都需要使用字符串拼接,但是这样很不方便,如下 var str1 = "I'm a string template" var str = "Hello Kotlin! " + str1 println(str)                  //Hello Kotlin! I'm a string template 如何你