day 08 kmp

115 阅读1分钟
  1. KMP
    1. 算法的核心思想:利用已匹配的部分信息,避免在文本串中回溯到已经比较过的字符。
    2. next数组核心:寻找相同的最长前后缀。
    3. next数组的求法:
      1. 比较p[i]和p[j+1]的值:(i=2,j=0,因为在i=1时ne[i]必定为0)
        • 如果p[i]等于p[j+1],则说明找到了一个相同的前缀后缀。将j增加1,并将ne[i]设置为j的值,表示p[i]之前的字符串中有多大长度的相同前缀后缀。
        • 如果p[i]不等于p[j+1],则需要回溯。将j更新为ne[j]的值,继续比较p[i]和p[j+1]。
      2. 重复步骤1,直到i遍历完整个模板串P。

简单实现: 题目描述

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

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

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

第二行输入字符串 P。

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

第四行输入字符串 S。

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

code.png