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

    }
}
相关推荐
ServBay1 分钟前
xAI的 Grok Bot发布,AI 已经学会自己上班了
后端·ai编程·grok
分支预测失败3 分钟前
RISC-V 多核缓存一致性机制解析:MESI 协议族、CMO 扩展与 Linux 同步原语
后端
n8n14 分钟前
Spring AI 检索增强生成(RAG)实战:让模型掌握你的私有知识
后端
Nturmoils27 分钟前
只备份一个 schema,别把整库都搬走
后端
妙码生花33 分钟前
利用AI从零学Go并完成实战项目,完工总结:目录结构
前端·后端·go
妙码生花36 分钟前
利用AI从零学Go并完成实战项目,完工总结:商业级开源产品定位和核心特性介绍
前端·后端·go
程序员cxuan1 小时前
GPT-6 Astra 的提示词泄露了,里面居然藏着个保安?
人工智能·后端·程序员
苍何1 小时前
WorkBuddy + 飞书的 8 种神仙用法(建议收藏)
后端
Captaincc1 小时前
掘金AI用量统计v0.1.0大更新-支持桌面宠物自定义和订阅额度卡片
前端·后端
大哥43092 小时前
AI 接口高并发 ≠ 秒杀高并发:为什么我把并发闸门挂在 LLM 调用汇聚点
后端