【LeetCode 刷题】字符串-反转字符串

此博客为《代码随想录》字符串章节的学习笔记,主要内容为反转字符串相关的题目解析。

文章目录

  • 344. 反转字符串
  • 541. 反转字符串 II
  • 151. 反转字符串中的单词

344. 反转字符串

题目链接

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        left, right = 0, len(s) - 1
        while left < right:
            s[left], s[right] = s[right], s[left]
            left += 1
            right -= 1
  • Python 可以直接写 s[left], s[right] = s[right], s[left],不用显式声明临时变量

语法糖写法

class Solution:
    def reverseString(self, s: List[str]) -> None:
        s[:] = s[::-1]
  • 不能写成 s = s[::-1],该语句等价于将反转后的列表对象赋值给变量 s(即变量 s 不再指向原来的列表),结果为原始的列表对象没有被修改
  • s[::-1] 会创建一个新的列表,不是原地操作,空间复杂度为 O ( n ) O(n) O(n)

541. 反转字符串 II

题目链接

class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        s = list(s)
        for i in range(0, len(s), 2 * k):
            s[i:i+k] = s[i:i+k][::-1]
        return ''.join(s)
  • 不能写成 s[i:i+k:-1],因为切片的步长为负数时,起点和终点的顺序需要反过来

151. 反转字符串中的单词

题目链接

class Solution:
    def reverseWords(self, s: str) -> str:
        s = s.strip()  # 删除首尾空格
        left = right = len(s) - 1
        res = []
        while left >= 0:
            # 找到当前单词的左边界
            while left >= 0 and s[left] != ' ':
                left -= 1
            res.append(s[left+1:right+1])
            # 跳过单词间的空格
            while left >= 0 and s[left] == ' ':
                left -= 1
            right = left
        return ' '.join(res)
  • 从后向前遍历,省去最后反转列表的操作
  • 删除首尾空格(主要是尾),为了保证 leftright 一开始指在字母位置

库函数

class Solution:
    def reverseWords(self, s: str) -> str:
        s = s.strip()
        strs = s.split()
        strs.reverse()
        return ' '.join(strs)

你可能感兴趣的:(LeetCode,leetcode,算法)