【代码随想录——字符串】

1. KMP算法

最长相等前后缀

1.1 如何计算前缀表

  • 前缀:是包含首字母,不包含尾字母的所有子串
  • 后缀:是包含尾字母,不包含首字母的所有子串
    求最长相等前后缀的长度

假设我们有一个模式串:aabaaf

模式最长相等前后缀最长相等前后缀的长度
a0
aaa1
aab0
aabaa1
aabaaaa2
aabaaf0

对于aabaaf我们得到了一个前缀表010120

1.2 如何使用前缀表

假设我们有一个字符串aabaabaaf,
对应的模式串和前缀表如下

序号012345
模式串aabaaf
前缀表010120
  1. 当我们匹配模式串到f的时候发现匹配不下去了
  2. 那我们查看f前一位所对应的前缀表所对应的值,如果不为0,则继续3。否则结束,字符串的匹配起点向后移动
  3. 之后从模式串的这一位继续匹配,如果再不匹配,则继续刚才的过程

1.3 next数组/prefix数组(其实就是前缀表)

next数组会告诉我们要回退到哪里。

  • 前缀表无减一:查看不匹配字符前一位所对应的前缀表所对应的值
  • 前缀表右移一位:最前面用-1补全,查看不匹配字符所对应的前缀表所对应的值
  • 前缀表减一:查看不匹配字符前一位所对应的前缀表所对应的值,并+1

1.4 代码实现

func strStr(haystack string, needle string) int {n := len(needle)if n ==0 {return 0}j := 0next := make([]int, n)getNext(next,needle)for i:=0;i<len(haystack);i++{for j>0 && haystack[i]!=needle[j]{j = next[j-1]}if haystack[i] == needle[j]{j++}if j == n {//匹配完成return i - n + 1}}return -1
}func getNext(next []int,s string){// 寻找[0:i]中最长相等前后缀的长度// i指向后缀末尾位置 ;j表示前缀需要和后缀匹配的位置indexj := 0next[0] = jfor i:=1;i<len(s);i++{for j>0 && s[i] != s[j]{j = next[j-1]}if s[i] == s[j]{j++}next[i] = j}
}

2. 反转字符串

在这里插入图片描述

func reverseString(s []byte)  {n := len(s)for i:=0;i<n/2;i++{s[i],s[n-1-i] = s[n-1-i],s[i]}
}

3. 反转字符串②

在这里插入图片描述

func reverseStr(s string, k int) string {chars := []byte(s)n := len(s)i := 2 * kfor ; i < n; i += 2 * k {//每有2k个翻转前部分reverse(chars, i-2*k, i-k-1)}// 检查最后剩下的一部分if n-(i-2*k) < k {reverse(chars, i-2*k, n-1)} else {reverse(chars, i-2*k, i-k-1)}return string(chars)
}func reverse(s []byte, begin, end int) {for begin < end {s[begin], s[end] = s[end], s[begin]begin++end--}
}

4. 替换数字

https://kamacoder.com/problempage.php?pid=1064
在这里插入图片描述

package mainimport ("fmt"
)func main() {var s stringfmt.Scan(&s) // 等待用户输入文本并按下回车fmt.Println(solution(s))
}func solution(s string) string {number := []byte("number")chars := []byte(s)res := make([]byte, 0)for i := 0; i < len(chars); i++ {if chars[i] >= '0' && chars[i] <= '9' {res = append(res, number...)} else {res = append(res, chars[i])}}return string(res)
}

5. 翻转字符串里的单词

在这里插入图片描述

func reverseWords(s string) string {chars := []byte(s)// 第一步,先清除一下左右两端多余的空格firstMeetCharIndex := -1lastMeetCharIndex := -1for i := 0; i < len(chars); i++ {if chars[i] != ' ' {lastMeetCharIndex = iif firstMeetCharIndex == -1 {firstMeetCharIndex = i}}}newChars := chars[firstMeetCharIndex : lastMeetCharIndex+1]//清除一下字符串中的多余的空格count := 0isSpace := falsefor i := 0; i < len(newChars); i++ {if newChars[i] == ' ' {if isSpace {continue}isSpace = true} else {isSpace = false}chars[count] = newChars[i]count++}// 反转整个数组reverse(chars, 0, count-1)// 反转单词p1, p2 := -1, -1for i := 0; i < count; i++ {if chars[i] == ' ' {p1 = p2p2 = ireverse(chars, p1+1, p2-1)}}reverse(chars, p2+1, count-1)return string(chars[:count])
}func reverse(s []byte, begin, end int) {for begin < end {s[begin], s[end] = s[end], s[begin]begin++end--}
}

6. 右旋转字符串

在这里插入图片描述

package mainimport ("fmt"
)func main() {var n intvar s stringfmt.Scanln(&n)fmt.Scanln(&s) // 等待用户输入文本并按下回车fmt.Println(solution(s, n))
}func solution(s string, n int) string {return s[len(s)-n:] + s[0:len(s)-n]
}

7. 实现strStr()

在这里插入图片描述

func strStr(haystack string, needle string) int {for i:=0;i<=len(haystack)-len(needle);i++{if isFit(haystack,needle,i){return i}}return -1
}func isFit(haystack,needle string,index int)bool{for i:=0;i<len(needle);i++{if haystack[index+i]!=needle[i]{return false}}return true
}

8. 重复的子字符串

在这里插入图片描述

func repeatedSubstringPattern(s string) bool {n := len(s)next := prefixTable(s)if next[n-1] != 0 && n%(n-next[n-1]) == 0 {return true}return false
}func prefixTable(s string) []int {j := 0 //前缀匹配到的位置res := make([]int, len(s))res[0] = 0for i := 1; i < len(s); i++ {for j > 0 && s[i] != s[j] {j = res[j-1]}if s[i] == s[j] {j++}res[i] = j}return res
}

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

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

相关文章

海外盲盒系统APP:加速开拓海外盲盒市场

近年来&#xff0c;潮玩逐渐受到大众的关注&#xff0c;尤其在盲盒的爆火下&#xff0c;人们对潮玩市场的需求不断增长。 在盲盒的增长下&#xff0c;我国盲盒开始向海外市场发展。海外消费者对盲盒同样有强烈的购买和收藏欲望&#xff0c;海外庞大的消费群体也为我国盲盒出海…

矩阵的对称正定性判决(复习)

文章目录 本科学的数学知识忘的太快了 如何判断一个实矩阵是否是对称正定 在线性代数中&#xff0c;一个实对称矩阵是否为正定可以通过以下方法判断&#xff1a; 对称性&#xff1a; 首先&#xff0c;确认矩阵是否对称&#xff0c;即矩阵的转置是否等于其本身。 特征值检查&…

typescript 模块化

模块的概念&#xff1a; 把一些公共的功能单独抽离成一个文件作为一个模块。 模块里面的变量、函数、类等默认是私有的&#xff0c;如果我们要在外部访问模块里面的数据&#xff08;变量、函数、类&#xff09;&#xff0c;需要通过export暴露模块里面的数据&#xff08;&#…

ShardingSphere5.3.0配置单数据源分表

本篇文章只适用于已知表数量的,不适合动态创建表。 1、配置文件 spring:datasource:type: com.alibaba.druid.pool.DruidDataSourceusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/db?useUnicode=true&use…

vpp文档的生成

1 生成文档 系统为Ubuntu 18.04.6 LTSgit clone下载相关的vpp源码&#xff0c;比如V20.01执行如下命令&#xff0c;生成代码对应的文档到{$top}/build-root/docs/html目录 #在top目录执行命令&#xff0c;安装依赖 make bootstrap-doxygen#在top目录执行命令&#xff0c;生成…

qt5-入门-xml文件读写

本地环境&#xff1a; win10专业版&#xff0c;64位&#xff0c;Qt 5.12 代码已经测试通过。其他例子日后更新。 假设需要读写的xml文档结构如下图所示&#xff1a; 那么首先需要修改.pro文件&#xff0c;增加一句&#xff1a; 然后执行qmake。 代码 #include <QtXml/Q…

【XR806开发板试用】基于MQTT与Cjson库的花式点灯

一、项目介绍 久闻openharmony大名&#xff0c;一直没有机会接触&#xff0c;感谢极术社区和全志社区的这次活动&#xff0c;让我能够了解并上手这个系统。 openhamony 1.1的内核是基于liteos内核系统进行构建的&#xff0c;liteos作为物联网系统&#xff0c;结合xr806小型开…

【Git】Commit后进行事务回滚

起因 因为一直使用git add .&#xff0c;在学习pytorch中添加了一个较大的数据集后&#xff0c;导致git push失败&#xff0c;而这个大数据集并不是必须要上传到仓库的&#xff0c;但是因为自己在设置.gitignore前已经进行了git comit&#xff0c;所以&#xff0c;需要进行事务…

十九、分布式数据库MyCat

目录 一、概述 1、MyCat是什么&#xff1f; 2、原理&#xff1a; 3、能干什么 1、读写分离 2、数据分片 3、多数据源整合 4、Mycat监控 4、安装部署 1、环境准备 2、安装 3、Mycat配置详解 1、server.xml user 标签 2、schema.xml schema标签&#xff1a; table标签&…

Android:展锐T710平台DDR定频和降频

ddr定频的pac&#xff0c;或者fdl1和spl的bin&#xff0c;比如定频到384 降频&#xff1a;&#xff08;可选频点&#xff1a;256&#xff0c;384&#xff0c;667&#xff0c;768&#xff0c;1024&#xff0c;1333&#xff0c;1536&#xff0c;1866&#xff09; /bsp/bootloader…

js中super关键字的使用

super关键字可以使用于对象,也可在类中使用,下面分别来说 对象 let parent {name: lili,getName(){console.log(this.name)} } let son {name: mike,getName(){super.getName()} } Object.setPrototypeOf(son, parent) son.getName() // mike可以看到对象中“方法”通过supe…

宜选影票在线选座电影票小程序开发如何获取api接口?

要开发一个在线选座电影票小程序并获取API接口&#xff0c;你需要遵循几个关键步骤。以下是通常的流程&#xff1a; 明确需求和目标&#xff1a; 在开始之前&#xff0c;明确你的小程序需要哪些功能&#xff0c;例如电影查询、场次查询、在线选座、购票支付等。确定你需要从AP…

普通人适合做大模型吗?过程中会发生什么潜在的挑战?

对于普通人来说&#xff0c;直接进行大模型的研发和训练可能存在一定的挑战&#xff0c;因为这通常需要以下资源和知识&#xff1a; 专业知识&#xff1a; 大模型的开发需要深入理解机器学习、深度学习、神经网络等领域的知识。 计算资源&#xff1a; 大模型的训练需要高性能的…

Docker基本操作 挂载数据卷

在创建一个容器的时候让容器挂载到一个数据卷: 命令:docker run --name mn -p 80:80 -v html:/usr/share/nginx/html -d nginx 这里的数据卷如果没有提前创好会自动创建 下边是命令解析 将容器挂载到一个数据卷之后 可以在查看数据卷的目录 在数据卷的目录可以找到容器的内容…

Cloudera简介与安装部署

Cloudera简介与安装部署 Cloudera是一家领先的大数据和分析平台提供商&#xff0c;其产品Cloudera Data Platform (CDP) 是一个全面的数据管理和分析平台&#xff0c;旨在帮助企业从大量数据中提取价值。CDP结合了开源大数据技术&#xff0c;如Apache Hadoop、Spark和Kafka&am…

小度二次开发中的java流式数据请求及返回

背景:小度大模型对接实现即小度二次开发接口对接-CSDN博客 为了接收CURL接口返回的流式数据并进行流式返回,我们需要对sendHttpRequest方法进行修改,使其能够处理InputStream并将其转换为流式返回的数据。以下是修改后的示例代码: import java.net.URI; import java.net.ht…

比亚迪CAN数据实时监控分析应用数字化差异化的决策价值洞察

在当今这个信息化飞速发展的时代&#xff0c;汽车数字化转型已成为企业持续竞争力的关键。中国新能源汽车行业的领军企业——比亚迪&#xff0c;其数字化之旅充分展现了企业的创新精神和对未来的深远洞察。 比亚迪的数字化战略不是简单的技术应用&#xff0c;而是一场深刻的商…

【算法】基础算法004之前缀和

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 前言 本篇文章为大家带来前缀和…

【强训笔记】day14

NO.1 思路&#xff1a;用一个哈希表&#xff0c;先遍历s1&#xff0c;统计哈希表内的字符个数&#xff0c;在遍历s2&#xff0c;s2中的字符在哈希表中减去&#xff0c;如果哈希表中的字符个数小于0那么就输出No。 代码实现&#xff1a; #include <iostream> #include&…

森林消防—高扬程水泵:守护绿色屏障的专业利器/恒峰智慧科技

在广袤的森林中&#xff0c;火灾无疑是最具破坏性的灾难之一。为了及时应对森林火灾&#xff0c;保护珍贵的自然资源和生态平衡&#xff0c;高效的消防设备显得尤为重要。森林消防高扬程水泵便是其中一款专业设备&#xff0c;以其高效输送水源的能力&#xff0c;成为守护森林绿…