二刷力扣--字符串

字符串

摘自Python文档-标准库:
在Python中, 字符串是由 Unicode 码位构成的不可变序列
由于不存在单独的“字符”类型,对字符串做索引操作将产生一个长度为 1 的字符串。 也就是说,对于一个非空字符串 s, s[0] == s[0:1]

不存在可变的字符串类型,但是 str.join()io.StringIO 可以被被用来根据多个片段高效率地构建字符串。

字符串常用方法:

  1. 查找子串 str.find(_sub_[, _start_[, _end_]])
    返回子字符串 subs[start:end] 切片内被找到的最小索引。 可选参数 startend 会被解读为切片表示法。 如果 sub 未被找到则返回 -1
  2. 拼接字符串 str.join(_iterable_)
    返回一个由 iterable 中的字符串拼接而成的字符串。 如果 iterable 中存在任何非字符串值包括 bytes 对象则会引发 TypeError。 调用该方法的字符串将作为元素之间的分隔。
  3. 切割字符串 str.split(_sep=None_, _maxsplit=- 1_)
    返回一个由字符串内单词组成的列表,使用 sep 作为分隔字符串。 如果给出了 maxsplit,则最多进行 maxsplit 次拆分(因此,列表最多会有 maxsplit+1 个元素)。 如果 maxsplit 未指定或为 -1,则不限制拆分次数(进行所有可能的拆分)。
  4. 去除前导和末尾字符 str.strip([_chars_])
    返回原字符串的副本,移除其中的前导和末尾字符。 chars 参数为指定要移除字符的字符串。 如果省略或为 None,则 chars 参数默认移除空白符。 实际上 chars 参数并非指定单个前缀或后缀;而是会移除参数值的所有组合。

344.反转字符串

输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
#双指针

class Solution:def reverseString(self, s: List[str]) -> None:"""Do not return anything, modify s in-place instead."""n = len(s)for i in range(n // 2):s[i], s[n - i - 1] = s[n - i - 1], s[i]

python中最简单的反转是用 `[::-1]

541. 反转字符串 II

#模拟
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

按照题意,模拟。

class Solution:def reverseStr(self, s: str, k: int) -> str:right = 2*kn = len(s)res = ""while right <= n: res += s[right-2*k:right-k][::-1] + s[right-k:right]right += 2*kright -= 2*kif n - len(res) < k:res += s[right:][::-1]elif n-len(res)>= k:res += s[right:right+k][::-1] + s[right+k:]return res

可以借助Python切片特性简化:

class Solution:def reverseStr(self, s: str, k: int) -> str:p = 0while p < len(s):p2 = p + ks = s[:p] + s[p: p2][::-1] + s[p2:]p = p + 2 * kreturn s

剑指 Offer 05. 替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

class Solution:def replaceSpace(self, s: str) -> str:res = ""for c in s:if c == " ":res += "%20"else:res += creturn res

151. 反转字符串中的单词

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

class Solution:def reverseWords(self, s: str) -> str:s = [x  for x in s.split(" ") if x != ''] return " ".join(s[::-1])

剑指 Offer 58 - II. 左旋转字符串

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

class Solution:def reverseLeftWords(self, s: str, n: int) -> str:s = s[n:] + s[:n]return s

28. 找出字符串中第一个匹配项的下标

给你两个字符串 haystackneedle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1

最简单的是直接遍历:

class Solution:def strStr(self, haystack: str, needle: str) -> int:n = len(haystack)left = 0right = len(needle)if right == 0:return 0while right <= n:if haystack[left: right] == needle:return leftleft += 1right += 1return -1

或者选择进入KMP:
KMP算法名字由发明它的三个人的名字组成,解决字符串的匹配问题。
假设在字符串s中匹配模板t
s:aabaabaaf
t:aabaaf

前缀和后缀:即字符串的一部分。
前缀即a, aa, aab, aaba, aabaa
后缀即f, af, aaf, baaf, abaaf

最长相等前后缀(前缀表next)
在这里插入图片描述

利用前缀表,当匹配失败的时候,可以跳到下一个匹配的位置。(本例中,aabaaf匹配失败时,找aabaa的前缀表,得到2,于是下一个匹配b。

class Solution:def getNext(s):next = [0] * len(s)j = 0  # j代表前缀末尾next[j] = 0for i in range(1,len(s)): # i代表后缀末尾while j > 0 and s[i] != s[j]:# 不等时回退jj = next[j-1]if s[i] == s[j]: # 相等时, j+1j += 1next[i] = jreturn nextdef strStr(self, haystack: str, needle: str) -> int:if len(needle) == 0:return 0next = Solution.getNext(needle)j = 0for i in range(len(haystack)):while j > 0 and  haystack[i] != needle[j]:j = next[j-1]if haystack[i] == needle[j]:j += 1if j == len(needle):return i-len(needle)+1 return -1

getNext的j=next[j-1]那里不是特别明白,但是背下来了。
next[j]就是记录着j(包括j)之前的子串的相同前后缀的长度

重复的子字符串

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

  1. 暴力
class Solution:def repeatedSubstringPattern(self, s: str) -> bool:n = len(s)if n <= 1:return Falsesubstr = ""for i in range(1, n//2 + 1):if n % i == 0:substr = s[:i]if substr * (n//i) == s:return Truereturn False
  1. find
    如果s由重复子串组成,那么两个s拼接在一起,中间肯定会再出现一个s。
    (当然这只说明了必要性,还要证明充分性。)
class Solution:def repeatedSubstringPattern(self, s: str) -> bool:n = len(s)if n <= 1:return Falsess = s[1:] + s[:-1]             return ss.find(s) != -1

字符串小结

字符串简单的题很简单,就是双指针、模拟,主要考察对字符串的基本操作。
复杂的会涉及到KMP(在s中找t)。虽然有库函数(find)可以实现这个过程。

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

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

相关文章

分布式调度 Elastic-job

分布式调度 Elastic-job 1.概述 1.1什么是任务调度 我们可以思考一下下面业务场景的解决方案: 某电商平台需要每天上午10点&#xff0c;下午3点&#xff0c;晚上8点发放一批优惠券某银行系统需要在信用卡到期还款日的前三天进行短信提醒某财务系统需要在每天凌晨0:10分结算…

IP地址SSL证书的作用是什么?

IP地址SSL证书的作用是确保网站连接的安全性和可信度。具体而言&#xff0c;IP地址SSL证书的作用包括以下几个方面&#xff1a; 1. 数据加密&#xff1a;IP地址SSL证书使用SSL协议为网站提供了数据加密功能。通过加密传输&#xff0c;证书可以保护敏感信息&#xff08;如用户登…

每日刷题-5

目录 一、选择题 二、算法题 1、不要二 2、把字符串转换成整数 一、选择题 1、 解析&#xff1a;printf(格式化串&#xff0c;参数1&#xff0c;参数2,.….)&#xff0c;格式化串: printf第一个参数之后的参数要按照什么格式打印&#xff0c;比如%d--->按照整形方式打印&am…

《TCP/IP网络编程》阅读笔记--Timewait状态和Nagle算法

1--Timewait状态 对于服务器端/客户端&#xff0c;当一端结束连接时&#xff0c;会向另一端发送 FIN 消息&#xff1b;两端的在经过四次挥手过程后&#xff0c;其 Socket 不会马上消除&#xff0c;而是会处于一个 Time-wait 状态的阶段&#xff0c;此时 Socket 拥有的端口号并没…

c语言练习57:浮点数在内存中的存储

浮点数在内存中的存储 上⾯的代码中&#xff0c; num 和 *pFloat 在内存中明明是同⼀个数&#xff0c;为什么浮点数和整数的解读结果会差别 这么⼤&#xff1f; 要理解这个结果&#xff0c;⼀定要搞懂浮点数在计算机内部的表⽰⽅法。 根据国际标准IEEE&#xff08;电⽓和电⼦⼯…

Linux服务使用宝塔面板搭建网站,并发布公网访问

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 前言 宝塔面板作为简单好用的服务器运维管理面板&#xff0c;它支持Linux/Windows系统&#xff0c;我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等&…

“山东工行杯”山东省第五届数据应用创新创业大赛开赛!

由山东省大数据局、共青团山东省委、山东省教育厅、山东省科学技术厅联合主办的“山东工行杯”山东省第五届数据应用创新创业大赛已于8月30日正式启动报名&#xff01;本届大赛以“场景赋能&#xff0c;数创齐鲁”为主题&#xff0c;设置数据赋能经济发展、数据赋能公共服务、数…

服务器数据恢复-Xen server虚拟机数据恢复案例

服务器数据恢复环境&#xff1a; 一台某品牌服务器通过一张同品牌某型号RAID卡将4块STAT硬盘组建为一组RAID10阵列。上层部署Xen Server虚拟化平台&#xff0c;虚拟机上安装的是Windows Server操作系统&#xff0c;包括系统盘 数据盘两个虚拟机磁盘&#xff0c;作为Web服务器使…

快速导入mysql较大的SQL文件

一般情况下&#xff0c;我们的网站或者小项目的数据库文件也就几十兆的大小&#xff0c;使用navicat等可视化工具快速就可以导入成功&#xff0c;但是当我们遇到几百兆或者更大的数据库文件时候&#xff0c;使用这些可视化工具去操作肯定是不可以的&#xff0c;亲测导入时间会特…

Pod和容器设计模式

为什么需要Pod 一些应用的实现是需要多个进程配合完成的&#xff0c;由于容器实际上是一个“单进程”模型&#xff0c;如果在容器里启动多个进程会存在进程管理的难题。在Kubernetes里面&#xff0c;实际上会被定义为一个拥有四个容器的Pod。 Pod相当于进程组 Kubernetes 是…

CSS文字居中对齐学习

CSS使用text-align属性设置文字对齐方式&#xff1b;text-align:center&#xff0c;这样就设置了文字居中对齐&#xff1b; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>css 水平居中</title><style>.box …

【SpringBoot集成Redis + Session持久化存储到Redis】

目录 SpringBoot集成Redis 1.添加 redis 依赖 2.配置 redis 3.手动操作 redis Session持久化存储到Redis 1.添加依赖 2.修改redis配置 3.存储和读取String类型的代码 4.存储和读取对象类型的代码 5.序列化细节 SpringBoot集成Redis 1.添加 redis 依赖 …

Redis从入门到精通(二:数据类型)

数据存储类型介绍 Redis 数据类型&#xff08;5种常用&#xff09; string hash list set sorted_set/zset&#xff08;应用性较低&#xff09; redis 数据存储格式 redis 自身是一个 Map&#xff0c;其中所有的数据都是采用 key : value 的形式存储 数据类型指的是存储的数据…

关于接口自动化,你不能不知道的高级技巧——接口自动化神器apin进阶操作

一、变量提取和引用 变量提取和引用主要是为了解决接口之间的参数依赖问题。 使用场景&#xff1a;接口 A 的参数中需要使用接口 B 返回的某个数据&#xff0c;那么就要在请求 B 接口之后&#xff0c;提取数据保存&#xff0c;给请求 A 接口时使用。 1、变量提取 在用例集或…

【开发】视频集中存储/直播点播平台EasyDSS点播文件分类功能优化

视频推拉流EasyDSS视频直播点播平台&#xff0c;集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体&#xff0c;可提供音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务。 TSINGSEE青犀视频的EasyDSS平台具有点播文件分类展示方法&#xf…

【智慧工地源码】物联网和传感器技术在智慧工地的应用

物联网&#xff08;IoT&#xff09;和传感器技术在智慧工地中扮演着至关重要的角色。这些技术的应用&#xff0c;使得智慧工地能够实现对施工过程的精确监控、数据收集和分析&#xff0c;以及设备互联&#xff0c;从而提高工程效率、减少成本并改善工人的工作环境。 一、物联网…

9.13号作业

1> 将之前定义的栈类和队列类都实现成模板类 栈的模块类 #include <iostream> using namespace std;template <typename T> class Stack { private:T data[40]{0};T top-1; public:Stack (){cout<<"这是构造函数"<<endl;}int stack_e…

关于 Unity 连接 MuMu 模拟器上的 Unity Remote 5 的方法

在使用 Unity 开发 Android 的过程中&#xff0c;可以通过使用 Unity Remote 这个 app 来和真机连接&#xff0c;进而在真实环境下进行测试性能等工作&#xff0c;而本次则是由于其他问题引出的一个小坑&#xff0c;记录以备后续查询。 这次是由于在自学过程中遇到的一个工程&…

应用在Wi-Fi音箱中的国产高性能DSP音频处理芯片

WiFi音箱的工作原理是通过无线路由器&#xff0c;将音箱接入到外部网络当中&#xff0c;然后在通过手机、平板、电脑等设备连接音箱&#xff0c;通过一些多媒体协议将音乐推送到音箱当中进行播放&#xff0c;WiFi音箱具有着传输能力强&#xff0c;可同时连接多个设备进行播放等…

c\c++ windows自动打开cmd并进入mysql

每次不用可视化工具查看数据库的时候饭都要winr->cmd->mysql -u root -p->密码 虽然不麻烦但是多少也得消耗你几秒钟&#xff0c;秉承着时间就是金钱的观念 我决定通过windows模拟输入实现快速通过命令行查看mysql数据库 涉及到的知识: windows拉起进程&#xff0c;…