Golang leetcode459 拼接+kmp算法

2024-01-21 22:36

本文主要是介绍Golang leetcode459 拼接+kmp算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 重复的子字符串 leetcode459
    • 暴力
    • 字符串拼接+KMP

重复的子字符串 leetcode459

暴力

func repeatedSubstringPattern(s string) bool {L := len(s)record := falsefor i := 1; i < L/2+1; i++ {if L%i != 0 {continue}num := L / ifor ; num > 0; num-- {if s[:i] != s[(num-1)*i:num*i] {record = falsebreak}record = true}if record == true {return record}}return record}

字符串拼接+KMP

如果有一个子字符串重复可以构成原字符串,则两个字符串拼接后其中一定包含一个原字符串
nnn=s,则s+s=nn|nnn|n中也包含一个s
abc=s,则s+s=a|bcab|c,其中bca,cab一定不为s

主要函数部分:

// 移动匹配-----------------------------------
func repeatedSubstringPattern(s string) bool {sDouble := s + sL := len(sDouble)if strStr(sDouble[1:L-1], s) == -1 {return false}return true
}

KMP函数部分:kmp算法相关请移步这篇文章

// kmp算法,用空间换时间
func strStr(haystack string, needle string) int {//获取next数组
next := initNext(needle)//主串长度
L := len(haystack)//目标匹配长度,即needle的长度
target := len(needle)//匹配字符串中指针位置
j := 0//i为主串中指针的位置
for i := 0; i < L; {// 如果匹配上了
if haystack[i] == needle[j] {
if j == target-1 {
return i - target + 1
}
j++
i++
} else { //如果没匹配上//跟计算next数组有异曲同工之妙
if j > 0 {
j = next[j-1]
} else {
i++
}}
}return -1
}// 此函数用来初始化next数组
func initNext(needle string) []int {
//后缀中末尾  abc中c
i := 1//前缀中末尾;同时在这里也有着记录最长公共串长度的作用,二者本质是一样的
j := 0L := len(needle)//初始化next数组;next[0]默认为0,因为对于一个字母我们不认为其具有前后缀,后续也不会再对next[0]进行赋值
next := make([]int, L)//求next数组过程中,我们的i不回退,采用类似于动态规划的思想,也是我们这里的循环条件
for i < L {//如果前后缀匹配
if needle[i] == needle[j] {//前缀末尾向后移一位,同时代表长度+1
j++//当前后缀末尾所在位置的最长子串即为j
//最长子串是有基础的,如果next[2]=2,那么next[3]的可能性为3或者0,这里是为3的情况
next[i] = j//后缀末尾向后移一位
i++} else { //如果前后缀不匹配//当j>0,说明仍旧处于回退的过程
if j > 0 {
j = next[j-1]
} else { //如果j=0,并且前后缀依旧不匹配,则长度计数应该重新从0开始//这里是为0的情况
next[i] = j//后缀末尾向后移
i++
}
}
}
//返回next数组
return next
}

这篇关于Golang leetcode459 拼接+kmp算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=

golang float和科学计数法转字符串的实现方式

《golangfloat和科学计数法转字符串的实现方式》:本文主要介绍golangfloat和科学计数法转字符串的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望... 目录golang float和科学计数法转字符串需要对float转字符串做处理总结golang float

golang实现延迟队列(delay queue)的两种实现

《golang实现延迟队列(delayqueue)的两种实现》本文主要介绍了golang实现延迟队列(delayqueue)的两种实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录1 延迟队列:邮件提醒、订单自动取消2 实现2.1 simplChina编程e简单版:go自带的time

Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)

《Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)》本文主要介绍了Golang分布式锁实现,采用Redis+Lua脚本确保原子性,持可重入和自动续期,用于防止超卖及重复下单,具有一定... 目录1 概念应用场景分布式锁必备特性2 思路分析宕机与过期防止误删keyLua保证原子性可重入锁自动

golang 对象池sync.Pool的实现

《golang对象池sync.Pool的实现》:本文主要介绍golang对象池sync.Pool的实现,用于缓存和复用临时对象,以减少内存分配和垃圾回收的压力,下面就来介绍一下,感兴趣的可以了解... 目录sync.Pool的用法原理sync.Pool 的使用示例sync.Pool 的使用场景注意sync.

golang中slice扩容的具体实现

《golang中slice扩容的具体实现》Go语言中的切片扩容机制是Go运行时的一个关键部分,它确保切片在动态增加元素时能够高效地管理内存,本文主要介绍了golang中slice扩容的具体实现,感兴趣... 目录1. 切片扩容的触发append 函数的实现2. runtime.growslice 函数gro

golang实现动态路由的项目实践

《golang实现动态路由的项目实践》本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习... 目录一、动态路由1.结构体(数据库的定义)2.预加载preload3.添加关联的方法一、动态路由1

Golang interface{}的具体使用

《Golanginterface{}的具体使用》interface{}是Go中可以表示任意类型的空接口,本文主要介绍了Golanginterface{}的具体使用,具有一定的参考价值,感兴趣的可以了... 目录一、什么是 interface{}?定义形China编程式:二、interface{} 有什么特别的?✅

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ