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

    }
}
相关推荐
江湖十年17 分钟前
Go 语言中 YAML to JSON 踩坑笔记
后端·go·json
你驴我1 小时前
WhatsApp 消息撤回与编辑的幂等性设计实践
java·服务器·前端·后端·python
一缕清烟在人间1 小时前
HarmonyOS开发实战:小分享-TextEditPage文字编辑器——Header+TextArea+工具栏
后端·华为·harmonyos·鸿蒙
人间凡尔赛1 小时前
K8s 十年之变:从 Cloud Native 到 AI Native,2026 年后端架构的范式革命
后端·云原生·架构
程序员cxuan1 小时前
Opus 5 深夜炸场,价格还挺香。。。
人工智能·后端·程序员
北冥you鱼2 小时前
Go 语言新手扫盲:指针 * 和 & 使用场景详解
开发语言·后端·golang
青山木2 小时前
Hot 100 ---腐烂的橘子
java·数据结构·后端·算法·leetcode·广度优先
卷无止境2 小时前
Python的collections模块:那些被低估的"瑞士军刀"
后端·python
卷无止境2 小时前
Python的方法解析顺序:一场关于继承顺序的精妙设计
后端·python
宁&沉沦2 小时前
Chrome 扩展 Manifest 字段版本支持一览(全量)
前端·后端·编辑器