LeetCode刷题记:字符串

116 阅读3分钟

作者: 千石
支持:点赞、收藏、评论
欢迎各位在评论区交流

前言

本文内容来自我平时学习的一些积累,如有错误,还请指正

在题目实战部分,我将代码实现和代码解释设置在了解题思路的下方,方便各位作为参考刷题

一些话

本文内容来自我平时学习的一些积累,如有错误,还请指正

在题目实战部分,我将代码实现和代码解释设置在了解题思路的下方,方便各位作为参考刷题

题目练习步骤:

  1. 给自己10分钟,读题并思考解题思路
  2. 有了思路以后开始写代码,如果在上一步骤中没有思路则停止思考并且看该题题解
  3. 在看懂题解(暂时没看懂也没关系)的思路后,背诵默写题解,直至能熟练写出来
  4. 隔一段时间,再次尝试写这道题目

刷题

344. 反转字符串 - 力扣(LeetCode)

image.png

思路

这道题要求我们原地反转一个字符数组,即不能使用额外的数组空间。我们可以使用双指针的方法,一个指针指向字符数组的开头,另一个指针指向字符数组的末尾,然后交换这两个指针所指向的字符。然后让左指针向右移动一个位置,右指针向左移动一个位置,继续交换。直到两个指针相遇。

代码实现

def reverseString(s):
    left, right = 0, len(s) - 1  # 定义左右指针
    while left < right:  # 左指针小于右指针时循环
        s[left], s[right] = s[right], s[left]  # 交换左右指针所指的字符
        left += 1  # 左指针向右移动一位
        right -= 1  # 右指针向左移动一位

541. 反转字符串 II - 力扣(LeetCode)

image.png

思路

本题可以使用字符串的切片和反转函数来实现。对于每个 2k 个字符的子串,我们只需要将其前 k 个字符反转,然后再拼接上剩余的字符即可。需要注意的是,如果剩余字符不足 k 个,就将其全部反转,如果剩余字符不足 2k 个但大于等于 k 个,就只反转前 k 个字符,其余字符保持不变。

代码实现

def reverseStr(s: str, k: int) -> str:
    n = len(s)
    res = ""
    for i in range(0, n, 2*k):
        # 取前 k 个字符反转
        res += s[i:i+k][::-1]
        # 取剩余字符不变
        res += s[i+k:i+2*k]
    return res

剑指 Offer 05. 替换空格 - 力扣(LeetCode)

image.png

思路

题目要求将字符串中的空格替换成 "%20",这可以通过遍历字符串,将每个空格替换成 "%20" 来实现。但是,由于字符串是不可变的对象,我们需要构造一个新的字符串来保存结果。

在实现中,我们可以先遍历一遍字符串,计算出字符串中空格的数量,然后创建一个新的字符串,长度为原字符串的长度加上空格数量乘以 2。接着,我们可以使用双指针法,将原字符串中的字符逐一复制到新字符串中,遇到空格则替换成 "%20"。最后,返回新字符串即可。

代码实现

def replaceSpaces(s: str) -> str:
    count = 0
    for c in s:
        if c == ' ':
            count += 1
    
    new_len = len(s) + 2 * count
    new_s = [''] * new_len
    i, j = len(s) - 1, new_len - 1
    
    while i >= 0:
        if s[i] == ' ':
            new_s[j-2:j+1] = ['%', '2', '0']
            j -= 3
        else:
            new_s[j] = s[i]
            j -= 1
        i -= 1
    
    return ''.join(new_s)