Acwing831KMP字符串

题目

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

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

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

输入格式

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

第二行输入字符串 P

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

第四行输入字符串 S

输出格式

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

数据范围

1≤N≤10^5 1≤M≤10^6

输入样例:

复制代码
3
aba
5
ababa

输出样例:

复制代码
0 2

代码

java 复制代码
import java.util.*;
class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        String p = in.next();
        int m = in.nextInt();
        String s = in.next();
        // p = p + " ";
        // s = s + " ";
        int[] ne = new int[n + 1];

        // 预处理模式串
        for (int i = 2, j = 0; i <= n; i++) {
            while (j > 0 && p.charAt(i - 1) != p.charAt(j)) j = ne[j];
            if (p.charAt(i - 1) == p.charAt(j)) j++;
            ne[i] = j;
        }

        StringBuilder result = new StringBuilder();

        // 在目标串中搜索模式串
        for (int i = 1, j = 0; i <= m; i++) {
            while (j > 0 && s.charAt(i - 1) != p.charAt(j)) j = ne[j];
            if (s.charAt(i - 1) == p.charAt(j)) j++;
            if (j == n) {
                result.append(i - n).append(" ");  // 将匹配的位置添加到StringBuilder中,一次性输出,解决超时问题
                j = ne[j];
            }
        }
        System.out.print(result.toString());

    }
}
相关推荐
a努力。5 分钟前
国家电网Java面试被问:二叉树的前序、中序、后序遍历
java·开发语言·后端·面试
疯狂的程序猴14 分钟前
Web 抓包在浏览器、代理、设备侧等不同层面的作用
后端
lalala_Zou19 分钟前
小米日常实习一面
java·后端·面试
算法与双吉汉堡26 分钟前
【短链接项目笔记】Day3 用户模块剩余部分
java·redis·后端
lhrimperial27 分钟前
MySQL底层原理
java·后端·mysql
熊猫吃竹子34 分钟前
JVM G1GC参数调优实战
jvm·后端
我认不到你34 分钟前
paxos一致性算法(大白话+图解)
分布式·后端
文心快码BaiduComate35 分钟前
插件开发实录:我用Comate在VS Code里造了一场“能被代码融化”的初雪
前端·后端·前端框架
austin流川枫38 分钟前
深度解析六大Java微服务框架
java·后端·微服务
martin10171 小时前
基于Spring Boot + Thymeleaf + Flying Saucer实现PDF导出功能
后端