导语
leetcode刷题笔记记录,本篇博客记录字符串部分的题目,主要题目包括:
- 344.反转字符串
- 541. 反转字符串II
- 剑指Offer 05.替换空格
- 151.翻转字符串里的单词
- 剑指Offer58-II.左旋转字符串
知识点
Python中,字符串是不可变的,这意味着一旦创建,它们就不能被修改。由于字符串的不可变性,如果修改字符串,只能通过创建一个新的字符串来实现。例如,使用字符串的连接操作或字符串的一些内置方法来生成一个新的字符串,或者更方便的方式是通过字符数组(列表)。
Leetcode 344.反转字符串
题目描述
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
解法
本题目就是让手动实现一下reserve函数,这里我们可以分别定义两个指针同时从头到尾进行相向运动即可,代码如下:
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
n = len(s)
i = 0
while i < n // 2 :
temp = s[i]
s[i] = s[n-1-i]
s[n-1-i] = temp
i += 1
return None
Leetcode 541. 反转字符串II
题目描述
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
- 如果剩余字符少于
k个,则将剩余字符全部反转。 - 如果剩余字符小于
2k但大于或等于k个,则反转前k个字符,其余字符保持原样。
示例 1:
输入: s = "abcdefg", k = 2
输出: "bacdfeg"
解法
直接模拟该过程即可,使用Python代码如下:
class Solution:
def reverseStr(self, s: str, k: int) -> str:
s_l = list(s)
for i in range(0, len(s), 2*k):
s_l[i: i+k] = reversed(s_l[i: i+k])
return "".join(s_l)
剑指Offer 05.替换空格
题目描述
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
解法
这道题没什么好说的,Python直接replace即可。如果不让使用replace,由于Python的字符串无法原地操作,所以可以新建一个新的字符串,在遇到空格时append对应的字符串即可。
class Solution:
def replaceSpace(self, s: str) -> str:
res = []
for i in range(len(s)):
if s[i] == ' ':
res.append('%20')
else:
res.append(s[i])
return ''.join(res)
151.翻转字符串里的单词
题目描述
给你一个字符串 s ,请你反转字符串中 单词 的顺序。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
解法
可以使用" ".join.split()去除中间多余的空格,也可以使用filter函数,参考www.techiedelight.com/zh/remove-e…
class Solution:
def reverseWords(self, s: str) -> str:
s_l = s.strip().split()[::-1]
return " ".join(s_l)
剑指Offer58-II.左旋转字符串
题目描述
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
解法
直接使用Python的切片完成。
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
return s[n:] + s[:n]