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

    }
}
相关推荐
逸风尊者1 分钟前
开发易掌握的知识:GeoHash查找附近空闲车辆
java·后端
程序猿阿越1 小时前
Kafka源码(一)Controller选举与创建Topic
java·后端·源码
程序员爱钓鱼1 小时前
Go语言项目工程化 — 常见开发工具与 CI/CD 支持
开发语言·后端·golang·gin
Jiude2 小时前
MinIO 社区版被故意阉割,Web管理功能全面移除。我来试试国产RustFS
后端·docker·架构
仰望星空@脚踏实地2 小时前
Spring Boot Web 服务单元测试设计指南
spring boot·后端·单元测试
羊小猪~~2 小时前
数据库学习笔记(十七)--触发器的使用
数据库·人工智能·后端·sql·深度学习·mysql·考研
用户8324951417322 小时前
JAVA 版本多版本切换 - 傻瓜式操作工具
后端
estarlee2 小时前
随机昵称网名API接口教程:轻松获取百万创意昵称库
后端
明天好,会的2 小时前
跨平台ZeroMQ:在Rust中使用zmq库的完整指南
开发语言·后端·rust
追逐时光者2 小时前
C#/.NET/.NET Core优秀项目和框架2025年6月简报
后端·.net