当前位置:网站首页>KMP 字符串匹配问题
KMP 字符串匹配问题
2022-08-01 21:34:00 【chengqiuming】
一 原问题链接
【模板】KMP字符串匹配 - 洛谷https://www.luogu.com.cn/problem/P3375
二 输入和输出
1 输入
第 1 行为字符串 s1,第 2 行为字符串 s2。字符串只含大写英文字母。
2 输出
首先输出若干行,每行一个整数,按从小到大的顺序输出 s2 在 s1 中出现的位置。最后一行输出 |s2| 个整数,第 i 个整数表示 s2 的长度为 i 的前缀的最长 border 的长度。
三 输入和输出样例
1 输入样例
ABABABC
ABA
2 输出样例
1
3
0 0 1
四 分析
本问题实质上是模式匹配和求解 KMP 算法中 next[] 数组的问题。
五 算法设计
1 输入字符串 s 和 t,采用 KMP 算法从头开始查找 t 在 s 中出现的位置。
2 求解字符串 t 的 next[] 数组。next[i] 表示 t 的长度为 i 的前缀的最长 border 的长度。
六 代码
package p3375;
import java.util.Scanner;
public class P3375 {
static int slen;
static int tlen;
static int next[] = new int[1000000 + 5];
// 求模式串 T 的 next 函数值
static void get_next(String t) {
int j = 0, k = -1;
next[0] = -1;
while (j < tlen) {//模式串t的长度
if (k == -1 || t.charAt(j) == t.charAt(k))
next[++j] = ++k;
else
k = next[k];
}
}
static void KMP(String s, String t) {
int i = 0, j = 0;
slen = s.length();
tlen = t.length();
get_next(t);
while (i < slen) {
if (j == -1 || s.charAt(i) == t.charAt(j)) { // 如果相等,则继续比较后面的字符
i++;
j++;
} else
j = next[j]; // j 回退到 next[j]
if (j == tlen) { // 匹配成功
System.out.println(i - tlen + 1);
j = next[j]; // 不允许重叠,j从0重新开始,如果允许重叠,j=nex[j]
}
}
}
public static void main(String[] args) {
String s, t;
Scanner scanner = new Scanner(System.in);
s = scanner.nextLine();
t = scanner.nextLine();
KMP(s, t);
for (int i = 1; i <= tlen; i++)
System.out.print(next[i] + " ");
}
}七 测试
绿色为输出,白色为输出。

边栏推荐
- 左旋氧氟沙星/载纳米雄黄磁性/As2O3磁性Fe3O4/三氧化二砷白蛋白纳米球
- 19 Lectures on Disassembly of Multi-merchant Mall System Functions - Invoice Management on the Platform
- Unity Shader general lighting model code finishing
- Dichotomy Medium LeetCode6133. Maximum Number of Groups
- 基于php在线学习平台管理系统获取(php毕业设计)
- The thing about npm
- 基于php在线音乐网站管理系统获取(php毕业设计)
- 微软校园大使喊你来秋招啦!
- C Pitfalls and Defects Chapter 5 Library Functions 5.5 Library Function Signal
- 【C语言实现】最大公约数的3种求法
猜你喜欢

数字图像处理 第十二章——目标识别

ImportError: `save_weights` requires h5py.问题解决

【建议收藏】ヾ(^▽^*)))全网最全输入输出格式符整理

HCIP---Architecture of Enterprise Network

ORI-GB-NP半乳糖介导冬凌草甲素/姜黄素牛血清白蛋白纳米粒的研究制备方法

【力扣】字符串相乘

Based on php animation peripheral mall management system (php graduation design)

测试开发人均年薪30w+?软件测试工程师如何进阶拿到高薪?

shell programming conventions and variables

Shell programming conditional statement
随机推荐
365天挑战LeetCode1000题——Day 046 生成每种字符都是奇数个的字符串 + 两数相加 + 有效的括号
Spark shuffle tuning
ModuleNotFoundError: No module named ‘yaml‘
Based on php tourism website management system acquisition (php graduation design)
多商户商城系统功能拆解19讲-平台端发票管理
虚拟内存与物理内存之间的关系
ARFoundation Getting Started Tutorial U2-AR Scene Screenshot Screenshot
磷酸化甘露糖苷修饰白蛋白纳米粒/卵白蛋白-葡聚糖纳米凝胶的
shell programming conventions and variables
方舟:生存进化PVE模式和PVP模式
Scala练习题+答案
Kubernetes Scheduler全解析
树莓派的信息显示小屏幕,显示时间、IP地址、CPU信息、内存信息(c语言),四线的i2c通信,0.96寸oled屏幕
Image fusion GANMcC study notes
迁移学习——Discriminative Transfer Subspace Learning via Low-Rank and Sparse Representation
小程序--独立分包&分包预下载
Appendix A printf, varargs and stdarg a. 2 use varargs. H to realize the variable argument list
0DFS中等 LeetCode6134. 找到离给定两个节点最近的节点
牛血清白蛋白-葡聚糖-叶黄素纳米颗粒/半乳糖白蛋白磁性阿霉素纳米粒的制备
方舟:生存进化官服和私服区别