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

相关文章

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

golang版本升级如何实现

《golang版本升级如何实现》:本文主要介绍golang版本升级如何实现问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录golanwww.chinasem.cng版本升级linux上golang版本升级删除golang旧版本安装golang最新版本总结gola

golang中reflect包的常用方法

《golang中reflect包的常用方法》Go反射reflect包提供类型和值方法,用于获取类型信息、访问字段、调用方法等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录reflect包方法总结类型 (Type) 方法值 (Value) 方法reflect包方法总结

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

Golang如何用gorm实现分页的功能

《Golang如何用gorm实现分页的功能》:本文主要介绍Golang如何用gorm实现分页的功能方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景go库下载初始化数据【1】建表【2】插入数据【3】查看数据4、代码示例【1】gorm结构体定义【2】分页结构体

在Golang中实现定时任务的几种高效方法

《在Golang中实现定时任务的几种高效方法》本文将详细介绍在Golang中实现定时任务的几种高效方法,包括time包中的Ticker和Timer、第三方库cron的使用,以及基于channel和go... 目录背景介绍目的和范围预期读者文档结构概述术语表核心概念与联系故事引入核心概念解释核心概念之间的关系

Golang 日志处理和正则处理的操作方法

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer

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

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