1)文章链接:
2)视频链接:
字符串基础操作! | LeetCode:344.反转字符串_哔哩哔哩_bilibili
字符串操作进阶! | LeetCode:541. 反转字符串II_哔哩哔哩_bilibili
字符串复杂操作拿捏了! | LeetCode:151.翻转字符串里的单词_哔哩哔哩_bilibili
3)今日收获:a. 541题中的跨越2k进行循环 b.数组可以对连续的多个位置进行一次性赋值 c.字符串-双指针翻转/ [::-1]翻转
[344]反转字符串
1.题目链接:https://leetcode.cn/problems/reverse-string/
2.题目难度:Easy
3.主要思路:双指针
4.代码:
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
l, r = 0, len(s)-1
while l<r:
s[l], s[r] = s[r], s[l]
l+=1
r-=1
[541]反转字符串II
1.题目链接:https://leetcode.cn/problems/reverse-string-ii/
2.题目难度:Easy
3.主要思路:a. 外层循环每次跨越2k个 b.如果长度大于字符串长度了,则把剩下的进行翻转 c.翻转字符串在python里面可以直接用[::-1]实现
4.代码:
class Solution:
def reverseStr(self, s: str, k: int) -> str:
for i in range(0,len(s),2*k):
j = i+k
if j<len(s):
s = s[:i]+s[i:j][::-1]+s[j:]
else:
s = s[:i]+s[i:len(s)][::-1]
return s
[剑指offer 05]替换空格
1.题目链接:https://leetcode.cn/problems/ti-huan-kong-ge-lcof/
2.题目难度:Easy
3.主要思路:a.双指针, 一个从字符串的末尾开始遍历,一个从结果集末尾开始遍历 b.注意数组可以对连续的多个位置一次性赋值
4.代码:
class Solution:
def replaceSpace(self, s: str) -> str:
cntSapce = s.count(' ')
res = list(s)
res.extend([' ']*cntSapce*2)
left, right = len(s)-1, len(res)-1
while left>=0:
if s[left]!=' ':
res[right] = s[left]
right-=1
left-=1
else:
res[right-2:right+1] = '%20' # 数组可以这个对多个连续的位置进行赋值
right-=3
left-=1
return ''.join(res)
[151]翻转字符串里的单词
1.题目链接:https://leetcode.cn/problems/reverse-words-in-a-string/
2.题目难度:Medium
3.主要思路:删除多余的空格(生成了单个字母&空格组成的列表list)+翻转整个字符串列表+翻转列表中的每个单词+拼接
4.代码:
class Solution:
# 删除多余的空格,并返回删除后的list数组
def trimSpace(self, s):
left, right = 0, len(s)-1
# 删除两端的空格
while left <= right and s[left]==' ':
left+=1
while left <= right and s[right]==' ':
right-=1
res = []
# 删除中间多余的空格
while left <= right:
if s[left]!=' ':
res.append(s[left])
elif s[left]==' ' and left-1>=0 and s[left-1]!=' ':
res.append(s[left])
left +=1
return res
# 翻转list数组
def reverse(self, l, left, right):
while left <= right:
l[left], l[right] = l[right], l[left]
left+=1
right-=1
return l
# 翻转数组中的每个单词
def reverse_word(self, l):
start = 0
end = 0
n = len(l)
while start<n:
while end<n and l[end]!=' ':
end+=1
l = self.reverse(l, start, end-1)
start=end+1
end+=1
return l
# 返回join后的结果
def reverseWords(self, s):
res = self.trimSpace(s) # 拆成了一个个的元素,不是一个个的单词
res = self.reverse(res, 0, len(res)-1)
res = self.reverse_word(res)
return ''.join(res)
[剑指offer58-II]左旋转字符串
1.题目链接:https://leetcode.cn/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/
2.题目难度:Easy
3.主要思路:三种方法:切片、遍历-数组+join、遍历-字符串
4.代码:
# 方法一:切片
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
return s[n:]+s[:n]
# 方法二:数组
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
res = []
for i in range(n, len(s)):
res.append(s[i])
for j in range(n):
res.append(s[j])
return ''.join(res)
# 方法三:字符串
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
res = ''
for i in range(n, len(s)):
res+=s[i]
for j in range(n):
res+=s[j]
return res