字符串part01
344.反转字符串
思路
使用双指针,我第一反应也是想到了前后两两互换,但我还考虑了分技术和偶数个元素,但其实双指针只要判断一下大小就好了。
代码
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
541. 反转字符串II
思路
当需要固定规律一段一段去处理字符串的时候,要在for循环的表达式上做文章。
代码
class Solution:
def reverse_substring(self, text):
left, right = 0, len(text) - 1
while left < right:
text[left], text[right] = text[right], text[left]
left += 1
right -= 1
return text
def reverseStr(self, s: str, k: int) -> str:
s_list = list(s)
for i in range(0, len(s), 2*k):
s_list[i : i + k] = self.reverse_substring(s_list[i : i + k])
return ''.join(s_list)
剑指Offer 05.替换空格
思路
使用双指针法。(开始想到的是replace函数,看来Python提供的函数确实很多)
数组填充类的问题,都可以先预先给数组扩容到填充后的大小,然后在从后向前进行操作。这么做有两个好处:
- 不用申请新数组。
- 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。
代码
class Solution:
def replaceSpace(self, s: str) -> str:
s_list = list(s)
counter = s.count(' ')
s_list.extend([' '] * counter * 2)
left, right = len(s) - 1, len(s_list) - 1
while left >= 0:
if s_list[left] == ' ':
s_list[right - 2 : right + 1] = '%20'
right -= 3
else:
s_list[right] = s_list[left]
right -= 1
left -= 1
return ''.join(s_list)
151.翻转字符串里的单词
思路
依然是双指针法,只不过列表中字符变成了单词。
代码
class Solution:
def reverseWords(self, s: str) -> str:
# 将字符串拆分为单词,即转换成列表类型
words = s.split()
# 反转单词
left, right = 0, len(words) - 1
while left < right:
words[left], words[right] = words[right], words[left]
left += 1
right -= 1
# 将列表转换成字符串
return " ".join(words)
剑指Offer58-II.左旋转字符串
思路
局部反转+整体反转可以达到左旋转且仅在本串上操作的目的。
具体步骤为:
- 反转区间为前n的子串
- 反转区间为n到末尾的子串
- 反转整个字符串
另外,reversed函数返回的是一个迭代器,需要转成列表或字符串。
代码
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
s = list(s)
s[0:n] = list(reversed(s[0:n]))
s[n:] = list(reversed(s[n:]))
s.reverse()
return "".join(s)
每日总结
今天的题目双指针是个重要的思路,并且要想到巧妙的思路后代码并不复杂(但问题是想不到 😦 )。