- KMP
- 算法的核心思想:利用已匹配的部分信息,避免在文本串中回溯到已经比较过的字符。
- next数组核心:寻找相同的最长前后缀。
- next数组的求法:
- 比较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]。
- 重复步骤1,直到i遍历完整个模板串P。
- 比较p[i]和p[j+1]的值:(i=2,j=0,因为在i=1时ne[i]必定为0)
简单实现: 题目描述
给定一个模式串 S,以及一个模板串 P,所有字符串中只包含大小写英文字母以及阿拉伯数字。 模板串P在模式串S中多次作为子串出现。
求出模板串P在模式串S中所有出现的位置的起始下标。
输入格式 第一行输入整数 N,表示字符串P的长度。
第二行输入字符串 P。
第三行输入整数 M,表示字符串 S的长度。
第四行输入字符串 S。
输出格式 共一行,输出所有出现位置的起始下标(下标从 0开始计数),整数之间用空格隔开。