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

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;海外庞大的消费群体也为我国盲盒出海…

typescript 模块化

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

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标签&…

宜选影票在线选座电影票小程序开发如何获取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 这里的数据卷如果没有提前创好会自动创建 下边是命令解析 将容器挂载到一个数据卷之后 可以在查看数据卷的目录 在数据卷的目录可以找到容器的内容…

比亚迪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;成为守护森林绿…

doris经典bug

在部署完登录web页面查看的时候会发现只有一个节点可以读取信息剩余的节点什么也没读取到 在发现问题后&#xff0c;我们去对应的节点去看log日志&#xff0c;发现它自己绑定到前端的地址上了 现在我们已经发现问题了&#xff0c;以下就开始解决问题 重置doris 首先对be进行操…

使用 Docker 部署 TaleBook 私人书籍管理系统

1&#xff09;项目介绍 GitHub&#xff1a;https://github.com/talebook/talebook Talebook 是一个简洁但强大的私人书籍管理系统。它基于 Calibre 项目构建&#xff0c;具备书籍管理、在线阅读与推送、用户管理、SSO 登录、从百度/豆瓣拉取书籍信息等功能。 友情提醒&#x…

矾液回收矾树脂

五氧化二钒溶液提取矾树脂A-654的过程&#xff0c;是一个涉及五氧化二钒提纯的重要步骤。我们将详细介绍这一提取过程。 首先&#xff0c;我们需要了解五氧化二钒和净化矾树脂A-654的基本性质。五氧化二钒是一种无机化合物&#xff0c; 净化矾树脂A-654 是一款加载了复杂的多胺…

亚马逊最新的 Echo Show 5 和 Show 8

爆爆&#xff01;亚马逊最新智能显示器终于来了&#xff01;Show 8可是一个功能超强的小工具&#xff0c;既能当数码相框、智能家居控制器和闹钟&#xff0c;还能控制您家中的几乎所有设备&#xff01;8英寸的显示屏让您流媒体和视频通话体验更加流畅&#xff01; 如果您不需要…

【Python】京东商品详情数据采集返回商品详情主题主图SKU

文章目录 Python请求 京东API接口 接入文档 接入参数 返回示例 Python请求 # coding:utf-8 """ Compatible for python2.x and python3.x requirement: pip install requests """ from __future__ import print_function import requests…

算法基础01一快速排序,归并排序,二分

一.排序 1.快速 排序 基于分治 确定分界点 左 右 中间 随机划分区间 左半边<x >x在右半边递归处理左右两端 #include<iostream>using namespace std;const int N 1e6 10;int n; int q[N]; void quick_sort(int q[],int l,int r) {if(l>r)return;//边界&…

东莞厂家冷风机的通风降温优点

工业冷风机的通风降温优点主要体现在以下几个方面&#xff1a; 高效降温&#xff1a;工业冷风机采用水蒸发原理&#xff0c;通过将热空气经过湿帘或水幕冷却&#xff0c;能够迅速降低空气温度。这种降温方式相比传统压缩机空调系统更为高效&#xff0c;有助于员工在高温环境中…