双指针题解——反转字符串中的单词【LeetCode】

 151. 反转字符串中的单词

m从后往前跑,是快指针;n在后面追,是慢指

通过双指针来划定每个单词!妙!

  1. 初始化:

    • m 是字符串 s 的最后一个字符的索引(len(s) - 1)。
    • res 是最终的结果字符串,初始为空。
  2. 去除尾部空格:

    • 从字符串的尾部开始,跳过所有的空格字符,直到遇到第一个非空格字符。
    • 这一步是为了避免在结果中引入多余的空格。
  3. 提取单词:

    • 使用双指针 m 和 n 来提取单词。
    • n 初始化为 m,表示当前单词的结束位置。
    • 内层 while 循环:m 从右向左移动,直到遇到空格或字符串的开头。此时,m + 1 到 n 之间的子串就是一个单词。
    • 将单词拼接到 res 中,并加上一个空格。
    • 跳过单词之间的空格,继续处理下一个单词。
  4. 返回结果:

    • 由于每次拼接单词时都会加上一个空格,最终结果会多出一个空格,因此返回 res[:-1],去掉最后一个空格。
class Solution(object):
    def reverseWords(self, s):
        """
        :type s: str
        :rtype: str
        """
        m = len(s) - 1
        res = ""
        # 除去尾部空格
        while m >= 0 and s[m] == ' ':
            m -= 1
        n = m  # n 是另一个指针
        while m >= 0:
            while m >= 0 and s[m] != ' ':
                m -= 1
            res += s[m + 1:n + 1] + " "  # 获取单词并加上空格
            while m >= 0 and s[m] == ' ':
                m -= 1
            n = m
        return res[:-1]  # 忽略最后一位的空格

假设 s = "the sky is blue",那么算法的执行过程如下:

  1. 初始化:

    • m = 14len(s) - 1),res = ""
  2. 去除尾部空格:

    • s[14] = 'e',不是空格,m 保持不变。
  3. 提取单词:

    • 第一次循环:
      • m 从 14 向左移动,直到遇到空格(m = 10)。
      • 提取单词 s[11:15] = "blue",拼接到 res 中,res = "blue "
      • 跳过空格,m = 9n = 9
    • 第二次循环:
      • m 从 9 向左移动,直到遇到空格(m = 6)。
      • 提取单词 s[7:10] = "is",拼接到 res 中,res = "blue is "
      • 跳过空格,m = 5n = 5
    • 第三次循环:
      • m 从 5 向左移动,直到遇到空格(m = 2)。
      • 提取单词 s[3:6] = "sky",拼接到 res 中,res = "blue is sky "
      • 跳过空格,m = 1n = 1
    • 第四次循环:
      • m 从 1 向左移动,直到遇到字符串开头(m = -1)。
      • 提取单词 s[0:2] = "the",拼接到 res 中,res = "blue is sky the "
      • 跳过空格,m = -1n = -1
  4. 返回结果:

    • 去掉最后一个空格,返回 "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 += 1
            right -= 1
        return s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值