双指针题解——反转字符串中的单词【LeetCode】
151. 反转字符串中的单词
m从后往前跑,是快指针;n在后面追,是慢指
通过双指针来划定每个单词!妙!
-
初始化:
m
是字符串s
的最后一个字符的索引(len(s) - 1
)。res
是最终的结果字符串,初始为空。
-
去除尾部空格:
- 从字符串的尾部开始,跳过所有的空格字符,直到遇到第一个非空格字符。
- 这一步是为了避免在结果中引入多余的空格。
-
提取单词:
- 使用双指针
m
和n
来提取单词。 n
初始化为m
,表示当前单词的结束位置。- 内层
while
循环:m
从右向左移动,直到遇到空格或字符串的开头。此时,m + 1
到n
之间的子串就是一个单词。 - 将单词拼接到
res
中,并加上一个空格。 - 跳过单词之间的空格,继续处理下一个单词。
- 使用双指针
-
返回结果:
- 由于每次拼接单词时都会加上一个空格,最终结果会多出一个空格,因此返回
res[:-1]
,去掉最后一个空格。
- 由于每次拼接单词时都会加上一个空格,最终结果会多出一个空格,因此返回
class Solution(object):def reverseWords(self, s):""":type s: str:rtype: str"""m = len(s) - 1res = ""# 除去尾部空格while m >= 0 and s[m] == ' ':m -= 1n = m # n 是另一个指针while m >= 0:while m >= 0 and s[m] != ' ':m -= 1res += s[m + 1:n + 1] + " " # 获取单词并加上空格while m >= 0 and s[m] == ' ':m -= 1n = mreturn res[:-1] # 忽略最后一位的空格
假设 s = "the sky is blue"
,那么算法的执行过程如下:
-
初始化:
m = 14
(len(s) - 1
),res = ""
。
-
去除尾部空格:
s[14] = 'e'
,不是空格,m
保持不变。
-
提取单词:
- 第一次循环:
m
从 14 向左移动,直到遇到空格(m = 10
)。- 提取单词
s[11:15] = "blue"
,拼接到res
中,res = "blue "
。 - 跳过空格,
m = 9
,n = 9
。
- 第二次循环:
m
从 9 向左移动,直到遇到空格(m = 6
)。- 提取单词
s[7:10] = "is"
,拼接到res
中,res = "blue is "
。 - 跳过空格,
m = 5
,n = 5
。
- 第三次循环:
m
从 5 向左移动,直到遇到空格(m = 2
)。- 提取单词
s[3:6] = "sky"
,拼接到res
中,res = "blue is sky "
。 - 跳过空格,
m = 1
,n = 1
。
- 第四次循环:
m
从 1 向左移动,直到遇到字符串开头(m = -1
)。- 提取单词
s[0:2] = "the"
,拼接到res
中,res = "blue is sky the "
。 - 跳过空格,
m = -1
,n = -1
。
- 第一次循环:
-
返回结果:
- 去掉最后一个空格,返回
"blue is sky the"
。
- 去掉最后一个空格,返回
344. 反转字符串
class Solution(object):def reverseString(self, s):""":type s: List[str]:rtype: 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 += 1right -= 1return s