当前位置: 首页 > news >正文

学习总结11

KMP算法

全称Knuth-Morris-Pratt算法,是一种字符串匹配算法。该算法的目的是在一个文本串S内查找一个模式串P的出现位置。

KMP算法的核心思想是利用模式串自身的特性来避免不必要的字符比较。算法通过构建一个部分匹配表(也称为next数组),来记录模式串中每个字符之前的前缀子串和后缀子串的最长公共长度。根据这个表,算法可以通过调整模式串的起始位置来跳过不需要比较的字符,从而提高匹配的效率。

KMP算法的具体步骤如下:

1. 预处理模式串P,构建部分匹配表next数组;
2. 设置两个指针i和j,分别指向文本串S和模式串P的起始位置;
3. 逐个比较S[i]和P[j],如果相等,则i和j同时后移;
4. 如果不相等,根据next数组跳过一部分字符,将j更新为next[j],同时i保持不变;
5. 重复步骤3和步骤4,直到找到一个匹配或者S已经遍历完。

KMP算法的时间复杂度为O(m+n),其中m和n分别是文本串和模式串的长度。相比于暴力匹配算法的时间复杂度O(m*n),KMP算法能够在较短的时间内找到匹配位置。

题目描述

给出两个字符串 s1​ 和 s2​,若 s1​ 的区间 [l,r] 子串与 s2​ 完全相同,则称 s2​ 在 s1​ 中出现了,其出现位置为 l。
现在请你求出 s2​ 在 s1​ 中所有出现的位置。

定义一个字符串 s 的 border 为 s 的一个非 s 本身的子串 t,满足 t 既是 s 的前缀,又是 s 的后缀。
对于 s2​,你还需要求出对于其每个前缀 s′ 的最长 border t′ 的长度。

输入格式

第一行为一个字符串,即为 s1​。
第二行为一个字符串,即为 s2​。

输出格式

首先输出若干行,每行一个整数,按从小到大的顺序输出 s2​ 在 s1​ 中出现的位置。
最后一行输出 ∣s2​∣ 个整数,第 i 个整数表示 s2​ 的长度为 i 的前缀的最长 border 长度。

输入输出样例

输入 #1复制

ABABABC
ABA

输出 #1复制

1
3
0 0 1 

说明/提示

样例 1 解释

对于 s2​ 长度为 3 的前缀 ABA,字符串 A 既是其后缀也是其前缀,且是最长的,因此最长 border 长度为 1。

数据规模与约定

本题采用多测试点捆绑测试,共有 3 个子任务。

Subtask 1(30 points):∣s1​∣≤15,∣s2​∣≤5。

Subtask 2(40 points):∣s1​∣≤10^4,∣s2​∣≤10^2。

Subtask 3(30 points):无特殊约定。

对于全部的测试点,保证 1≤∣s1​∣,∣s2​∣≤10^6,s1​,s2​ 中均只含大写英文字母。

#include<stdio.h> 
#include<string.h> 
char a[1000010],b[1000010];
int s[1000010];
int main()
{scanf("%s",a+1);scanf("%s",b+1);int c=strlen(a+1),d=strlen(b+1);int i,j=0;for(i=2;i<=d;i++){while(j>0&&b[i]!=b[j+1]) j=s[j];if(b[i]==b[j+1]) j++;s[i]=j;}j=0;for(i=1;i<=c;i++){while(j>0&&a[i]!=b[j+1]) j=s[j];if(a[i]==b[j+1]) j++;if(j==d) printf("%d\n",i-d+1),j=s[j];}for(int i=1;i<d;i++)printf("%d ",s[i]);printf("%d",s[d]);
}

http://www.lryc.cn/news/299970.html

相关文章:

  • Hadoop运行环境搭建
  • CTFshow web(php命令执行59-67)
  • 03、全文检索 -- Solr -- Solr 身份验证配置(给 Solr 启动身份验证、添加用户、删除用户)
  • 怎么使用ChatGPT提高工作效率?
  • 【微服务】skywalking自定义告警规则使用详解
  • BUGKU-WEB 矛盾
  • 2024-02-11 Unity 编辑器开发之编辑器拓展2 —— 自定义窗口
  • Python 读取pdf文件
  • 人究其一生只是在通用智能模型基础上作微调和对齐
  • DS:二叉树的链式结构及实现
  • PhP+vue企业原材料采购系统_cxg0o
  • C++线程池
  • SpringCloud-Hystrix:服务熔断与服务降级
  • 浅谈Linux环境
  • Spring 用法学习总结(一)之基于 XML 注入属性
  • 免费软件推荐-开源免费批量离线图文识别(OCR)
  • 2 scala集合-元组和列表
  • Spring Boot开启SSL/Https进行交互。
  • 88.Go设计优雅的错误处理
  • Python4Delphi: Delphi 程序使用 Python 抓取网页
  • 编辑器Zed
  • Java的接口
  • 【计算机网络】计算机软件工程人工智能研究生复试资料整理
  • 【Network Management】AUTOSAR架构下CanNm User Data详解
  • 量子算法入门——2.线性代数与复数
  • 分别通过select、多进程、多线程实现一个并发服务器
  • 如何在 emacs 上开始使用 Tree-Sitter (archlinux)
  • FL Studio2024最新中文版有哪些其新功能特点?
  • Oracle的学习心得和知识总结(三十二)|Oracle数据库数据库回放功能之论文四翻译及学习
  • 系统架构27 - 软件架构设计(6)