字符串应用-实现KMP匹配算法

2023-11-17

题目描述

给定一个主串S和子串P,使用KMP算法查找子串P在主串S中存在的位置,若子串P在主串S中存在,则输出与子串P中第一字符相等的字符在主串S中的序号;若不存在则输出“no”

程序输入格式:主串S 子串P;

程序输出格式:输出与子串P中第一字符相等的字符在主串S中的序号;

输入样例:ababcabcacbab abcac

输出样例:5

附件

样例输入输出
样例1
输入:
ababcabcacbab abcac
输出:
5
样例2
输入:
ABCDABCDABDE DBAEA
输出:
no


#include <iostream>
#include <string>
using namespace std;

void getnext(string t,int next[])
{
	next[1]=0;
	int i=1,j=0;
	while (i<t.length()-1)
	{
		if (j==0||t[i]==t[j])
		{
			++i;++j;
			next[i]=j;
		}
		else
			j=next[j];
	}
	//优化版
	for (int m=2;m<t.length();m++)
	{
		if (t[m]==t[next[m]])
		{
			next[m]=next[next[m]];
		}
	}
	
}

void Index_KMP(string s,string t)
{
	int *next=new int[t.length()+1];
	getnext(t,next);
    /*for (int i = 1; i < t.length(); i++)
	{
		cout<<next[i]<<" ";
	}
	cout<<endl;
	*/
	int i=1;int j=1;
	while (i<s.length()&&j<t.length())
	{
		if (j==0||s[i]==t[j])
		{
			++i;++j;
		}
		else
		{
			j=next[j];
		}
	}
	if (j>=t.length())
	{
		
		cout<< i-t.length();
		delete []next;
	}
	else
	{
		
		cout<<"no";
		delete []next;
	   
	}


}




int main()
{
	string s,t;
	cin>>s;
	cin>>t;
	Index_KMP(" "+s," "+t);
system("pause");
return 0;
}

对于这道题有一种next是从-1开始的
但是会出现问题
//这里出现-1大于 .length() or .size() 的情况是因为-1变成无符号是补码全为1超级大
//因为string的size类型是size_t,一般是32位或者64位无符号整数;而-1是int类型,
//在与unsigned int(也可能是unsigned long等等,看你具体编译器)进行比较时会被提升为相应的无符号类型,而-1的二进制补码是全1,
//把全1的二进制码当做无符号数解释的时候是无符号数的最大值,所以-1是最大的。
所以要把t.length() 变成 signed(t.length())再和-1比较

#include <string>
using namespace std;

void getnext(string t,int next[])
{
	next[0]=-1;
	int i=0,j=-1;
	while(i<t.length()-1)
	{
		if (j==-1||t[i]==t[j])
		{
			++i;++j;
			next[i]=j;
		}
		else
		{
			j=next[j];
		}

	}
	//这个优化可有可无
	for (int m=2;m<t.length();m++)
	{
		if (t[m]==t[next[m]])
		{
			next[m]=next[next[m]];
		}
	}
	

}
void kmp(string s,string t)
{
	int *next=new int[t.length()];
	getnext(t,next);
	int i=0,j=0;
	
	
	//这里出现-1大于  .length()  or  .size()  的情况是因为-1变成无符号是补码全为1超级大
	//因为string的size类型是size_t,一般是32位或者64位无符号整数;而-1是int类型,
	//在与unsigned int(也可能是unsigned long等等,看你具体编译器)进行比较时会被提升为相应的无符号类型,而-1的二进制补码是全1,
	//把全1的二进制码当做无符号数解释的时候是无符号数的最大值,所以-1是最大的。


	while (i<s.length()&&j<signed(t.length()))
	{
		if (j==-1||s[i]==t[j])
		{
			++i;++j;
		}
		else
		{
			j=next[j];
		}
	}
	if (j>=signed(t.length()))
	{
		cout<< i-t.length();
		delete []next;
	}
	else
	{

		cout<<"no";
		delete []next;

	}

}

int main()
{
	string s,t;
	cin>>s;
	cin>>t;
	kmp(s,t);
	system("pause");
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字符串应用-实现KMP匹配算法 的相关文章

随机推荐

  • 同步、异步和阻塞、非阻塞的区别与联系

    同步 异步和阻塞 非阻塞的概念 同步 在执行一个操作的时候需要等待当前操作执行完毕才能执行下一操作 相当于操作串行化 即执行当前函数的时候需要拿到当前函数的返回结果才可以继续执行 异步 在执行一个操作的时候不需要拿到返回结果 只需要拿到注册
  • 程序员必备的免费AI生产力(摸鱼)工具,最后一个,人手必备

    最近ChatGPT等AI技术风靡全球 对于普通大众来说 越来越多的人开始关注智能时代对我们生活的影响 它颠覆了写作 办公 绘画 音视频 图像处理 UI 设计等领域 并涌现出了一批具有颠覆性的应用 在程序员领域 许多 AI 工具已经涌现 如
  • Android fragment间的通讯

    1 使用FragmentPagerAdapter情况下 param viewpagerId viewpager id eg R id vp param position fragment 的位置 return private Fragmen
  • linux线程内存开销

    1 首先是线程自己栈 程序没设置过 就是默认的 ulimit s 中的值 现在一般都是10240 单位KB 2 跟版本有关 是否有 glibc 的 malloc per thread arenas 特性 有了这个特性 设置不好 一个新线程要
  • 2003 - Cant't connect to MySQL server on 'ip'(10060 "Unknown error")

    问题描述 今天在搭建服务器之后 安装好MySQL 启动成功 并且创建远程连接用户 用户名和密码都正确 使用Navicat远程连接抛出如下错误 2003 Cant t connect to MySQL server on 192 168 13
  • Go module的介绍及使用

    Go1 1 1版本发布 2018 08 24发布 已经过去几天 从官方的博客中看到 有两个比较突出的特色 一个就是今天讲的module 模块概念 目前该功能还在试验阶段 有些地方还需要不断的进行完善 在官方正式宣布之前 打算不断修正这种支持
  • 牛客网:美团2021校招笔试-编程题(通用编程试题,第10场)

    某比赛已经进入了淘汰赛阶段 已知共有n名选手参与了此阶段比赛 他们的得分分别是a 1 a 2 a n 小美作为比赛的裁判希望设定一个分数线m 使得所有分数大于m的选手晋级 其他人淘汰 但是为了保护粉丝脆弱的心脏 小美希望晋级和淘汰的人数均在
  • Vivido添加pynq-Z2开发板

    一 下载pynq z2开发板文件 下载地址 https www tulembedded com FPGA ProductsPYNQ Z2 html 二 将下载的文件解压到vivado安装的位置 如果boards目录下面没有boards fi
  • 软件测试自动化UI框架之生成测试报告

    设置报告 自动化测试最后的运行结果要以报告的形式呈现 报告的格式是web端网页 需要引入第三方库 不是唯一的 有很多 一般一个公司统一用一个 1 引入自动生成测试框架报告 2 创建测试报告生成文件夹 reports 3 写代码 框架的入口文
  • UE4开发七:UE4打包

    一 使用UFE打包 UFE Unreal Frontend 虚幻前端 简化加快游戏开发及测试任务的工具 它可以用来准备游戏构建 将游戏部署到设备上并进行启动 测试版本 4 18为例 注意 UE4官方文档原话是在UE4编辑器中启动UFE或者P
  • java并发编程笔记(四)--JMM内存模型

    1 计算机结构 输入设备 就是我们的鼠标 键盘 存储器 对应的就是我们的内存 缓存 运算器和控制器共同组成了cpu 而输出设备就比如显示屏 打印机 我们重点来聊一下缓存 2 缓存 其实 当我们说计算机运行效率低下 速度慢 往往不是cpu的锅
  • Qt: QStringList去除重复元素

    项目中有个需求 有一个Qt字符串列表 里面有一些元素是重复的 要求去除 只留下不重复的元素 方法如下 QStringList distin QStringList list A B C D B B E B E C for int i 0 i
  • Redis(三)

    一 SpringBoot与Redis集成 1 引入依赖
  • 数组去重--根据ID去除数组中重复的数据

    根据ID去除数组中重复的数据 let data id 1 name 你好 id 1 name 你好 let obj let peon data reduce item index gt obj index id obj index id t
  • 使用js完成定时弹出广告设置

  • [485]python识别验证码系列3(基于机器学习)

    基于python语言的tensorflow的 端到端 的字符型验证码识别 1 Abstract 验证码 CAPTCHA 的诞生本身是为了自动区分 自然人 和 机器人 的一套公开方法 但是近几年的人工智能技术的发展 传统的字符验证已经形同虚设
  • Java系列笔记(3) - Java 内存区域和GC机制

    目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC Garbage Collection 垃圾收集 垃圾回收 机制 是Java与C
  • Ubuntu云原生环境安装,docker+k8s+kubeedge(亲测好用)

    docker安装步骤 Linux 一 移除以前docker相关包 sudo apt get autoremove docker docker ce docker engine docker io containerd runc 二 设置存储
  • 概率与计算机论文,概率归纳逻辑分析论文

    摘要 从穆勒等人对或然性的探讨 经耶方斯对概率归纳逻辑的开创 到卡尔纳普代表的现代概率归纳逻辑体系 考察了概率归纳逻辑的发展历程 从中揭示其兴起的原因 并分析现代归纳逻辑发展的一些新趋势 关键词 概率归纳 逻辑 概率论 概率归纳逻辑旨在以数
  • 字符串应用-实现KMP匹配算法

    题目描述 给定一个主串S和子串P 使用KMP算法查找子串P在主串S中存在的位置 若子串P在主串S中存在 则输出与子串P中第一字符相等的字符在主串S中的序号 若不存在则输出 no 程序输入格式 主串S 子串P 程序输出格式 输出与子串P中第一