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

news2024/12/23 18:42:43

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 := 0
    next := 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表示前缀需要和后缀匹配的位置index
    j := 0
    next[0] = j
    for 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 * k
	for ; 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 main

import (
	"fmt"
)

func main() {
	var s string
	fmt.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 := -1
	lastMeetCharIndex := -1
	for i := 0; i < len(chars); i++ {
		if chars[i] != ' ' {
			lastMeetCharIndex = i
			if firstMeetCharIndex == -1 {
				firstMeetCharIndex = i
			}
		}
	}
	newChars := chars[firstMeetCharIndex : lastMeetCharIndex+1]
	//清除一下字符串中的多余的空格
	count := 0
	isSpace := false
	for 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, -1
	for i := 0; i < count; i++ {
		if chars[i] == ' ' {
			p1 = p2
			p2 = i
			reverse(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 main

import (
	"fmt"
)

func main() {
	var n int
	var s string
	fmt.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] = 0
	for 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.coloradmin.cn/o/1652006.html

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

相关文章

使用公有云主机部署ftp服务被动模式(centos操作系统)

文章目录 前言一、FTP服务搭建1.1 部署服务1.2 修改配置文件1.3 重启服务1.3 配置项解答 二、安全组设置访问规则2.1配置监听端口2.2 配置数据端口三、使用ftp登陆工具测试3.1 使用工具进行测试 总结 前言 使用公有云上的云主机搭建FTP服务器。 步骤思路&#xff1a; 1、云主机…

20240507 ubuntu20.04+ros noetic 跑通lioslam

任务&#xff1a;跑通lioslam 主要参考博客 IMU激光雷达融合使用LIO-SAM建图学习笔记——详细、长文、多图、全流程_ubuntu_AIDE回归线-GitCode 开源社区 (csdn.net) 1.不要用这一句 wget -O ~/Downloads/gtsam.zip https://github.com/borglab/gtsam/archive/4.0.0-alpha2…

web安全day03

MYSQL注入&#xff1a; SQL 注入的原理、危害及防御措施 SQL 注入的原理&#xff1a;原本的 SQL 语句在与用户可控的参数经过了如拼接、替换等字符串操作后&#xff0c;得到一个新的 SQL 语句并被数据库解析执行&#xff0c;从而达到非预期的效果。 SQL 注入的危害&#xff…

Java集合简介

单列集合 双列集合

MySQL数据库及数据表的创建

1.创建一个名叫 db_classes 的数据库&#xff1a; 创建一个叫 db_classes 的数据库MySQL命令&#xff1a; create database db_classes; 运行效果&#xff1a; 创建数据库后查看该数据库基本信息MySQL命令&#xff1a; show create database db_classes; 运行效果&#xff…

社交媒体数据恢复:多闪

社交软件多闪是一款深受用户喜爱的社交应用&#xff0c;用于与朋友、家人保持联系。有时&#xff0c;多闪软件的聊天记录可能会丢失或被删除&#xff0c;这时用户需要进行数据恢复。本文将详细介绍多闪软件聊天记录的恢复过程。 一、多闪软件聊天记录恢复方法 从手机备份中恢…

Vue 中 $nextTick 的作用是什么?

目录 一、NextTick是什么 为什么要有nexttick 二、使用场景 三、实现原理 一、NextTick是什么 官方对其的定义 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法&#xff0c;获取更新后的 DOM 什么意思呢&#xff1f; 我们可以理解成&#xff0c…

一路串联电机的绕制原理

这里要说明的一点是 对于一路串联的电机&#xff0c;无论是一把线圈还是两把线圈&#xff0c;出来的都是只有两个线头&#xff0c;可看做一个整体来对待&#xff01; 绕制具体原理 同心式线圈绕制 前面说的都是等距式的 线圈绕制&#xff0c;下面我们讲解一下同心式的绕制办法…

Android studio 打开Device Mirroring方便调试

巧合下发现一个很好用的工具&#xff0c;在平时调试真机的时候在每次run app后都要低头找找手机看看效果。但是&#xff0c;用了AS上的Device Mirroring&#xff0c;你会发现根本不需要再低头点手机&#xff0c;调试方便一万倍啊。 话不多说&#xff0c;上图。直接就可以在电脑…

ogv转mp4怎么转?只需3个步骤~

OGV&#xff08;Ogg Video&#xff09;是一种开源的视频文件格式&#xff0c;起源于对数字媒体领域的开放标准的需求。作为Ogg多媒体容器的一部分&#xff0c;OGV的设计初衷是提供一种自由、高质量的视频编码方案&#xff0c;以满足多样化的应用需求。 支持打开MP4文件格式的软…

基于SpringBoot的高校推荐系统

项目介绍 当前&#xff0c;随着高等教育的不断普及&#xff0c;越来越多的学生选择考研究生来提高自身的学术水平和竞争力。然而&#xff0c;考研生在选择报考院校和专业时面临着众多的选择和信息不对称的问题。为了解决这些问题&#xff0c;一些网站和APP已经推出了相关的院校…

2024年数维杯数学建模ABC题思路分析

文章目录 1 赛题思路2 比赛日期和时间3 竞赛信息4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

Find My资讯|苹果设备在修复期间可以保持启用“Find My“功能

iOS 17.5 中有一项名为"维修状态"的新功能&#xff0c;可让送修的设备保持启用"查找我的"&#xff08;Find My&#xff09;功能。此前&#xff0c;用户在送修设备时必须禁用跟踪设备位置的"查找我的"功能&#xff0c;但iOS 17.5发布后&#xff0…

YOLOv8原理解析[目标检测理论篇]

接下来是我最想要分享的内容&#xff0c;梳理了YOLOv8预测的整个流程&#xff0c;以及训练的整个流程。 关于YOLOv8的主干网络在YOLOv8网络结构介绍-CSDN博客介绍了&#xff0c;为了更好地介绍本章内容&#xff0c;还是把YOLOv8网络结构图放在这里&#xff0c;方便查看。 1.YOL…

C++奇迹之旅:string类对象的容量操作

文章目录 &#x1f4dd; string类的常用接口&#x1f309; string类对象的容量操作&#x1f320;size&#x1f320;length&#x1f320;capacity&#x1f320;clear&#x1f320;empty&#x1f320;reserve&#x1f309;resize &#x1f6a9;总结 &#x1f4dd; string类的常用…

通义千问免费新功能:EMO,让照片和视频“活”起来

&#x1f9d9;‍♂️ 诸位好&#xff0c;吾乃斜杠君&#xff0c;编程界之翘楚&#xff0c;代码之大师。算法如流水&#xff0c;逻辑如棋局。 &#x1f4dc; 吾之笔记&#xff0c;内含诸般技术之秘诀。吾欲以此笔记&#xff0c;传授编程之道&#xff0c;助汝解技术难题。 &#…

编写burp插件实现数据包自定义修改

背景 安全测试工作中经常遇到各种加密加签或者添加了其它安全措施的数据包。以加密为例&#xff0c;为了测试正常进行&#xff0c;我们需要解密后修改数据包再进行加密还原&#xff0c;手工的话很是繁琐且没必要&#xff0c;所以我们需要一个工具帮我们自动化的实现。由于我们…

盘点一下近年来常用的电脑监控软件

企业电脑监控软件通常用于监视员工在工作时间内的电脑使用情况&#xff0c;以确保他们的工作效率和安全性。以下是几种常见的企业电脑监控软件&#xff1a; 1、Ping32 Ping32是一款集成多功能的企业级电脑监控软件&#xff0c;包括员工上网行为管理、文件外发审计、屏幕活动监…

Stable Diffusion Ai绘画模型推荐:二次元Coriander_Mix v1大模型推荐

负tag嵌入式:EasyNegative,badhandv4 此模型经测试是写实偏3D的效果 画质灰暗的话请加&#xff1a;VAE840000 或者负tag&#xff1a;(watermark:2),(blurry:2),fat,paintings,sketches,(worst quality:2),(low quality:2),(normal quality:2),((monochrome)), ((grayscale))…