【KMP 滚动哈希】1392. 最长快乐前缀

news2024/12/28 22:22:35

本文涉及知识点

KMP 滚动哈希

LeetCode1392. 最长快乐前缀

「快乐前缀」 是在原字符串中既是 非空 前缀也是后缀(不包括原字符串自身)的字符串。
给你一个字符串 s,请你返回它的 最长快乐前缀。如果不存在满足题意的前缀,则返回一个空字符串 “” 。
示例 1:
输入:s = “level”
输出:“l”
解释:不包括 s 自己,一共有 4 个前缀(“l”, “le”, “lev”, “leve”)和 4 个后缀(“l”, “el”, “vel”, “evel”)。最长的既是前缀也是后缀的字符串是 “l” 。
示例 2:
输入:s = “ababab”
输出:“abab”
解释:“abab” 是最长的既是前缀也是后缀的字符串。题目允许前后缀在原字符串中重叠。
提示:
1 <= s.length <= 105
s 只含有小写英文字母

KMP

就是s的最长公共前后缀。时间复杂度: O(n)

代码

核心代码

class KMP
{
public:
	virtual int Find(const string& s, const string& t)
	{
		CalLen(t);	
		m_vSameLen.assign(s.length(), 0);
		for (int i1 = 0, j = 0; i1 < s.length(); )
		{
			for (; (j < t.length()) && (i1 + j < s.length()) && (s[i1 + j] == t[j]); j++);
			//i2 = i1 + j 此时s[i1,i2)和t[0,j)相等 s[i2]和t[j]不存在或相等
			m_vSameLen[i1] = j;
			//t[0,j)的结尾索引是j-1,所以最长公共前缀为m_vLen[j-1],简写为y 则t[0,y)等于t[j-y,j)等于s[i2-y,i2)
			if (0 == j)
			{
				i1++;
				continue;
			}
			const int i2 = i1 + j;
			j = m_vLen[j - 1];
			i1 = i2 - j;//i2不变
		}

		for (int i = 0; i < m_vSameLen.size(); i++)
		{//多余代码是为了增加可测试性
			if (t.length() == m_vSameLen[i])
			{
				return i;
			}
		}
		return -1;
	}
	vector<int> m_vSameLen;//m_vSame[i]记录 s[i...]和t[0...]最长公共前缀,增加可调试性
	static vector<int> Next(const string& s)
	{// j = vNext[i] 表示s[0,i]的最大公共前后缀是s[0,j]
		const int len = s.length();
		vector<int> vNext(len, -1);
		for (int i = 1; i < len; i++)
		{
			int next = vNext[i - 1];
			while ((-1 != next) && (s[next + 1] != s[i]))
			{
				next = vNext[next];
			}
			vNext[i] = next + (s[next + 1] == s[i]);
		}
		return vNext;
	}
protected:
	void CalLen(const string& str)
	{
		m_vLen.resize(str.length());
		for (int i = 1; i < str.length(); i++)
		{
			int next = m_vLen[i - 1];
			while (str[next] != str[i])
			{
				if (0 == next)
				{
					break;
				}
				next = m_vLen[next-1];
			}
			m_vLen[i] = next + (str[next] == str[i]);
		}
	}
	int m_c;
	vector<int> m_vLen;//m_vLen[i] 表示t[0,i]的最长公共前后缀	
};

class Solution {
public:
	string longestPrefix(string s) {
		auto v = KMP::Next(s);
		const int len = v.back() + 1;
		return s.substr(0, len);
	}
};

测试用例

template<class T1,class T2>
void AssertEx(const T1& t1, const T2& t2)
{
	Assert::AreEqual(t1 , t2);
}

template<class T>
void AssertEx(const vector<T>& v1, const vector<T>& v2)
{
	Assert::AreEqual(v1.size(), v2.size());	
	for (int i = 0; i < v1.size(); i++)
	{
		Assert::AreEqual(v1[i], v2[i]);
	}
}

template<class T>
void AssertV2(vector<vector<T>> vv1, vector<vector<T>> vv2)
{
	sort(vv1.begin(), vv1.end());
	sort(vv2.begin(), vv2.end());
	Assert::AreEqual(vv1.size(), vv2.size());
	for (int i = 0; i < vv1.size(); i++)
	{
		AssertEx(vv1[i], vv2[i]);
	}
}

namespace UnitTest
{
	string s;
	TEST_CLASS(UnitTest)
	{
	public:
		TEST_METHOD(TestMethod0)
		{
			s = "level";
			auto res = Solution().longestPrefix(s);
			AssertEx(string("l"), res);
		}
		TEST_METHOD(TestMethod1)
		{
			s = "ababab";
			auto res = Solution().longestPrefix(s);
			AssertEx(string("abab"), res);
		}
	};
}

扩展阅读

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关推荐

我想对大家说的话
《喜缺全书算法册》以原理、正确性证明、总结为主。
按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1859529.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

改装的电荷泵从数字信号中提取能量

本设计理念中描述的倍压器是 Dickson 电荷泵的改进版。与该电路不同&#xff0c;它不需要直流输入电压&#xff0c;而只需要一个数字时钟&#xff0c;其峰值理想情况下在输出端加倍为直流电压。 图 1 倍压器产生自己的局部 V 该电路用作电荷泵&#xff0c;其中 C1 充电至输入时…

Android笔记-adb keycode大全

使用方法 用adb发送按键事件时&#xff0c;可以使用下面表中的枚举值或者直接使用数值&#xff0c;比如 adb shell input keyevent KEYCODE_HOME 或者 adb shell input keyevent 3 下面按三种排序方法列出所有按键的 keycode&#xff0c; 分别是&#xff1a; 按功能分 按枚…

【实用软件】Paragon NTFS for Mac 15下载及安装教程

​习惯上来说所有操作只需轻轻一点&#xff1a;轻量级的快捷菜单栏&#xff0c;可访问所有NTFS驱动器并执行最常见的卷操作&#xff0c;如挂载&#xff0c;卸载和验证&#xff0c;从菜单栏中快速启动NTFS for Mac界面&#xff0c;一键点击&#xff0c;更加方便。11510182322410…

昇思25天学习打卡营第01天|基本介绍快速入门

一、什么是昇思MindSpore&#xff1f; 昇思MindSpore是一个全场景深度学习框架&#xff0c;详见基本介绍 那什么是深度学习呢&#xff1f; 深度学习是一种特殊的机器学习&#xff0c;主要是利用了多层神经网络模拟人脑&#xff0c;自动提取特征并进行预测。 什么是机器学习…

【Python机器学习】凝聚聚类——层次聚类与树状图

凝聚聚类生成了所谓的层次聚类。聚类过程迭代进行&#xff0c;每个点都从一个单点簇变为属于最终的某个簇。每个中间步骤都提供了数据的一种聚类&#xff08;簇的个数也不相同&#xff09;。有时候&#xff0c;同时查看所有可能的聚类也是有帮助的。 举例&#xff1a; import …

【pytorch07】broadcast广播

Broadcasting expand&#xff08;与上一节说的expand功能相同&#xff0c;可以扩展维度&#xff0c;但是这里是自动的&#xff0c;扩展的时候不需要拷贝数据&#xff09;without coping data broadcast实施 从最小的维度开始匹配&#xff0c;如果前面没有维度的话&#xff0…

BFS:解决拓扑排序问题

文章目录 什么是拓扑排序&#xff1f;关于拓扑排序的题1.课程表2.课程表Ⅱ3.火星词典 总结 什么是拓扑排序&#xff1f; 要知道什么拓扑排序我们首先要知道什么是有向无环图&#xff0c;有向无环图我们看名字其实就很容易理解&#xff0c;有向就是有方向&#xff0c;无环就是没…

类的默认成员函数——构造与析构函数

如果一个类中什么成员都没有&#xff0c;简称为空类。但是空类中真的什么都没有吗&#xff1f; 当然不是&#xff0c;任何类在什么都不写的情况下&#xff0c;编译器会自动生成6个默认成员函数 1.构造函数 1.1概念引入 对于以下这个Date类&#xff0c;可以通过Init公有方法给…

北邮《计算机网络》传输层笔记

内容一览 缩写复习单词复习传输层前言传输协议的要点拥塞控制UDPTCP VS UDPTCP 缩写复习 AIMD XCP ECN WFQ max-min-fair ARQ PAWS TSAP NSAP TCP UDP RTT SCTP SACK NAK RST MSS 单词复习 inverse multiplexing(SCTP) convergence crashed machine protocol scenarios asym…

IIC学习笔记

目录 #I2C涉及相关知识 #I2C相关介绍 欢迎指正&#xff0c;希望对你&#xff0c;有所帮助&#xff01;&#xff01;&#xff01; 个人学习笔记&#xff0c;参考文献&#xff0c;链接最后&#xff01;&#xff01;&#xff01; #I2C涉及相关知识 SDA串行数据线&#xff1a; Ser…

GB28181视频汇聚平台EasyCVR接入Ehome设备视频播放出现异常是什么原因?

多协议接入视频汇聚平台EasyCVR视频监控系统采用了开放式的架构&#xff0c;系统可兼容多协议接入&#xff0c;包括市场标准协议&#xff1a;国标GB/T 28181协议、GA/T 1400协议、JT808、RTMP、RTSP/Onvif协议&#xff1b;以及主流厂家私有协议及SDK&#xff0c;如&#xff1a;…

RK3568平台(音频篇)耳机插拔检测

一.硬件原理图 耳机输出硬件原理图&#xff1a; 耳机实物图&#xff1a; 耳机插入硬件原理&#xff1a; 耳机插入后HP_DET_L会连接耳机的GND&#xff0c;从而实现HP_DET_L叫从高到低的状态。 耳机插入软件原理&#xff1a; 软件需要在驱动里面定时的读取gpio的状态&#xf…

2024期权交易佣金手续费最低是多少?期权交易有哪些成本?

显性成本 期权交易的显性成本包含期权交易的佣金和交易所费用&#xff0c;分别支付给券商和交易所&#xff0c;统一由券商代收。 佣金 期权佣金是期权交易时支付给券商的费用&#xff0c;佣金通常以交易金额的一定比例计算&#xff0c;可以是固定费用&#xff0c;也可以是滑…

尽管与 ChatGPT 达成了合作,但据报道苹果仍在与 Meta 进行人工智能谈判

苹果最近宣布计划将人工智能纳入 iOS 18 以及新的 iPhone 16 和 iPhone 16 Pro 机型中&#xff0c;并开始与潜在的生成式人工智能合作伙伴 Meta 进行讨论。 据《华尔街日报》报道&#xff0c;苹果已与 Meta 就将其跨平台使用的生成式人工智能模型整合到 Apple Intelligence 中…

avi格式视频提示无法播放错误,怎么解决?

AVI视频属于一种无损质量的视频格式&#xff0c;一般来说是兼容Windows系统播放的。播不了可能是由以下原因导致的&#xff1a; 1.文件损坏&#xff1a;可能是原文件在转码压缩的过程中操作不当&#xff0c;导致数据丢失、文件损坏。 2.播放器格式不支持&#xff1a;可能系统的…

计算机图形学入门16:阴影映射

1.前言 前面几篇关于光栅化的文章中介绍了如何计算物体表面的光照&#xff0c;但是着色并不会进行阴影的计算&#xff0c;阴影需要单独进行处理&#xff0c;目前最常用的阴影计算技术之一就是Shadow Mapping技术&#xff0c;也就是俗称的阴影映射技术。 2.阴影映射 Shadow Map…

使用Tauri+vite+koa2+mysql开发了一款待办效率应用

&#x1f389;使用Taurivitekoa2mysql开发了一款待办效率应用 &#x1f4dd;项目概述 这是一个基于taurivite的应用&#xff0c;它采用了一些最新的前端技术&#xff0c;包括 Tauri、Vue3、Vite5、koa2 和 mysql。它提供了丰富的效率管理工具。 应用地址&#xff1a;https:/…

excel字符串列的文本合并

excel表有两列&#xff0c;第一列是“姓名”&#xff0c;第二列是“诊断”&#xff0c;有高血压、糖尿病等。我想出一个统计表&#xff0c;统计“姓名”&#xff0c;把某一个姓名的诊断不重复的用、拼接起来&#xff0c;比如“张三”的诊断为“点高血压”、糖尿病。我们可以用T…

轻量级SEO分析工具网站源码去授权

轻量级SEO分析工具网站全新去授权发布&#xff0c;这款工具将助您轻松生成直观、简洁、易于理解的SEO报告&#xff0c;为您的网页排名和表现提供有力支持。 测试环境&#xff1a; Apache PHP 8.0 MySQL 5.7 更新日志 v12.0 – 2024年2月20日 新增功能&#xff1a; 正常运行…

LabVIEW在核磁共振实验室的应用

​核磁共振&#xff08;NMR&#xff09;实验室在进行复杂的核磁共振实验时&#xff0c;需要一个高效、灵活且易于操作的实验控制和数据采集系统。传统的NMR实验系统往往使用专门的硬件和软件&#xff0c;存在系统封闭、扩展性差、维护成本高等问题。为了解决这些问题&#xff0…