344. Reverse String
双指针
首尾两个指针交换
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
left = 0
right = len(s) - 1
while left < right:
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
Python reverse()
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
s.reverse()
541. Reverse String II
这道题就是模拟
class Solution:
def reverseStr(self, s: str, k: int) -> str:
res = list(s)
for i in range(0, len(res), 2*k):
if i + k < len(res):
# Reverse the first k characters for every 2k characters
# If there are < 2k but >= k characters, reverse the first k characters
res[i: i+k] = res[i: i+k][::-1]
else:
# If there are fewer than k characters left, reverse all of them
res[i:] = res[i:][::-1]
# return res
return ''.join(res)
剑指 Offer 05. 替换空格
不额外申请空间的话,需要先扩充数组,再利用双指针
class Solution:
def replaceSpace(self, s: str) -> str:
n = s.count(' ')
res = list(s)
res.extend([' ']*n*2)
left = len(s) - 1
right = len(res) - 1
while left >= 0:
if res[left] != ' ':
res[right] = res[left]
right -= 1
else:
res[right-2: right+1] = '%20'
right -= 3
left -= 1
return ''.join(res)
当然也可以直接调用replace
方法。
151. Reverse Words in a String
直接使用API
class Solution:
def reverseWords(self, s: str) -> str:
s = s.split()[::-1]
return ' '.join(s)
自行编写对应函数
- 去除多余空格
- 反转整个字符串
- 反转单个单词
class Solution:
def trim_spaces(self, s: str) -> list:
left, right = 0, len(s) - 1
# 去掉字符串开头的空白字符
while left <= right and s[left] == ' ':
left += 1
# 去掉字符串末尾的空白字符
while left <= right and s[right] == ' ':
right -= 1
# 将字符串间多余的空白字符去除
output = []
while left <= right:
if s[left] != ' ':
output.append(s[left])
elif output[-1] != ' ':
output.append(s[left])
left += 1
return output
def reverse(self, l: list, left: int, right: int) -> None:
while left < right:
l[left], l[right] = l[right], l[left]
left, right = left + 1, right - 1
def reverse_each_word(self, l: list) -> None:
n = len(l)
start = end = 0
while start < n:
# 循环至单词的末尾
while end < n and l[end] != ' ':
end += 1
# 翻转单词
self.reverse(l, start, end - 1)
# 更新start,去找下一个单词
start = end + 1
end += 1
def reverseWords(self, s: str) -> str:
l = self.trim_spaces(s)
# 翻转字符串
self.reverse(l, 0, len(l) - 1)
# 翻转每个单词
self.reverse_each_word(l)
return ''.join(l)
剑指 Offer 58 - II. 左旋转字符串
具体步骤为:
- 反转区间为前n的子串
- 反转区间为n到末尾的子串
- 反转整个字符串
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
res = list(s)
res[0: n] = res[0: n][::-1]
res[n: len(res)] = res[n: len(res)][::-1]
res = res[::-1]
return ''.join(res)