代码随想录算法训练营第七天(字符串篇)|Leetcode344反转字符串,Leetcode541反转字符串II,卡码网54替换数字

Leetcode 344 反转字符串

题目链接: 反转字符串
给定一个字符串,要求输出将其反转后的结果

思路: 在部分语言中(如Java和python), 字符串不可变,此时对于字符串的修改需要用到辅助空间,这点在之后的题目中会体现。在本题中,我们既可以使用双指针从字符串两边向中间遍历,遍历过程中交换元素以反转字符串;也可以通过分片的方式(更pythonic)直接反转字符串

具体代码实现

# 双指针法
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
# 分片法
class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        s[:] = s[::-1]

时间复杂度: O(n)

Leetcode 541 反转字符串II

题目链接: 反转字符串II
给定一个字符串,并给定一个数值k。要求从前到后遍历字符串,每经过2k个字符时,就将前k个字符进行反转。字符串末尾处若不足2k个字符,仍然进行反转直到字符串末尾(至多k个字符)

思路: 既可以遍历字符串,每经过2k个字符就对前k个进行反转;也可以直接使用分片法直接处理

class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        from typing import List
        def reverseStrPart(text: List) -> List:
            left, right = 0, len(text)-1
            while left<right:
                text[left], text[right] = text[right], text[left]
                left += 1
                right -= 1
            return text

        myString = list(s)
        for i in range(0, len(s), 2*k):
            myString[i:i+k] = reverseStrPart(myString[i:i+k])

        return ''.join(myString)
class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        # 注意到此处反转时,应该先尝试取前k个字符,即s[i:i+k],随后再进行反转[::-1],而不是直接尝试s[i:i+k:-1]
        # 这样可以避免最后字符不足k个导致出错的情况
        for i in range(0, len(s), 2*k):
            s = s[:i] + s[i:i+k][::-1] + s[i+k:]  

        return s

时间复杂度: O(n)

替换数字

题目链接: 替换数字
给定一个字符串,将其中的所有数字替换为'number',如'a1b2c3'替换为'anumberbnumbercnumber'

思路: 此处我们既可以通过列表模拟字符串,先遍历一遍数组,找出数组中数字的个数。由于所有的数字都会被替换为'number',相当于每发生一次替换,字符串的长度就增加5。我们可以据此确定新字符串的长度,随后从后向前进行替换操作。还可以考虑从前向后仅遍历一遍字符串,遇到数字就进行替换。

具体代码实现:

# 利用辅助空间
def replace_num(s: str):
    i, size = 0, len(s)
    while i < size:
        if s[i].isdigit():
            s = s[:i] + 'number' + s[i+1:]
            size += 5
        i += 1

    return s

def main():
    mystring = input()
    result_string = replace_num(mystring)
    print(result_string)
# 通过列表模拟字符串,实现替换
def replace_num(s: str):
    mylist = list(s)
    new_length = len(mylist)
    for i in mylist:
        if i.isdigit():
            new_length += 5

    result = [''] * new_length
    old_idx, new_idx = len(s)-1, new_length-1
    while old_idx >= 0:
        if not mylist[old_idx].isdigit():
            result[new_idx] = mylist[old_idx]
        else:
            result[new_idx-5:new_idx+1] = 'number'
            new_idx -= 5

        old_idx -= 1
        new_idx -= 1

    return ''.join(result)


def main():
    mystring = input()
    result_string = replace_num(mystring)

时间复杂度: O(n)

posted @ 2025-08-14 11:45  雪痕春风天音九重色  阅读(8)  评论(0)    收藏  举报