字符替换问题 | 豆包MarsCode AI刷题

96 阅读4分钟

问题描述

给定一个字符串S,需要将字符串中所有的小写字母'a'替换为"%100"。这是一个基础的字符串替换问题,需要返回替换后的新字符串。

解题思路

这个问题可以通过以下几种方式解决:

  1. 直接使用字符串的replace方法:

    • Python的字符串提供了内置的replace方法,可以直接完成替换
    • 这是最简单和最直观的解决方案
  2. 遍历字符串方式:

    • 逐个检查字符串中的每个字符
    • 遇到'a'时追加"%100",否则追加原字符
    • 使用列表存储结果并最终合并

代码实现

def solution(s: str) -> str:
    return s.replace('a', '%100')

if __name__ == '__main__':
    print(solution(s="abcdwa") == '%100bcdw%100')
    print(solution(s="banana") == 'b%100n%100n%100')
    print(solution(s="apple") == '%100pple')

示例分析

样例1:

  • 输入:s = "abcdwa"
  • 输出:"%100bcdw%100"
  • 分析:字符串中有两个'a',都被替换为"%100"

样例2:

  • 输入:s = "banana"
  • 输出:"b%100n%100n%100"
  • 分析:字符串中有三个'a',每个都被替换为"%100"

样例3:

  • 输入:s = "apple"
  • 输出:"%100pple"
  • 分析:字符串开头的'a'被替换为"%100"

复杂度分析

使用replace方法:

  • 时间复杂度:O(n),其中n是字符串长度
  • 空间复杂度:O(n),需要存储新的字符串

使用遍历方法:

  • 时间复杂度:O(n),需要遍历整个字符串
  • 空间复杂度:O(n),在最坏情况下(全是'a')会扩展为原来的多倍

扩展思考

  1. 如果需要替换多个不同的字符怎么处理?
  2. 如果替换的目标字符串长度不固定怎么处理?
  3. 在内存受限的情况下,如何优化空间使用?

1. 替换多个不同字符的处理方案

方案一:使用多次replace

def multi_replace(s: str) -> str:
    replacements = {
        'a': '%100',
        'b': '%200',
        'c': '%300'
    }
    for old, new in replacements.items():
        s = s.replace(old, new)
    return s

方案二:使用正则表达式

import re

def multi_replace_regex(s: str) -> str:
    replacements = {
        'a': '%100',
        'b': '%200',
        'c': '%300'
    }
    pattern = '|'.join(map(re.escape, replacements.keys()))
    return re.sub(pattern, lambda m: replacements[m.group()], s)

2. 处理可变长度替换字符串的方案

动态替换方案

def dynamic_replace(s: str, replacements: dict) -> str:
    result = []
    i = 0
    while i < len(s):
        replaced = False
        # 检查从当前位置开始的所有可能匹配
        for key, value in sorted(replacements.items(), key=lambda x: len(x[0]), reverse=True):
            if s[i:].startswith(key):
                result.append(value)
                i += len(key)
                replaced = True
                break
        if not replaced:
            result.append(s[i])
            i += 1
    return ''.join(result)

# 使用示例
replacements = {
    'a': '%100',
    'ab': '%200',
    'abc': '%300'
}
print(dynamic_replace("abcdef", replacements))  # 优先匹配最长的模式

3. 内存优化方案

方案一:使用生成器

def memory_efficient_replace(s: str) -> str:
    def char_generator():
        for char in s:
            if char == 'a':
                yield '%100'
            else:
                yield char
    
    return ''.join(char_generator())

方案二:分块处理

def chunk_replace(s: str, chunk_size: int = 1024) -> str:
    result = []
    for i in range(0, len(s), chunk_size):
        chunk = s[i:i + chunk_size]
        processed_chunk = chunk.replace('a', '%100')
        result.append(processed_chunk)
    return ''.join(result)

方案三:原地替换(适用于可变字符串)

def in_place_replace(chars: list) -> None:
    """
    假设输入是字符列表而不是字符串
    这种方法适用于类似LeetCode这样的原地修改要求
    """
    i = 0
    while i < len(chars):
        if chars[i] == 'a':
            # 为要插入的新字符腾出空间
            chars[i:i] = list('%100')
            i += 4  # 跳过插入的新字符
        else:
            i += 1

性能比较

各方案的性能对比:

  1. 单次replace:

    • 优点:代码简单,内置函数效率高
    • 缺点:不适合复杂的替换规则
  2. 正则表达式:

    • 优点:灵活性强,可以处理复杂模式
    • 缺点:对于简单替换来说开销较大
  3. 生成器方案:

    • 优点:内存占用小,适合处理大文件
    • 缺点:总体处理时间可能较长
  4. 分块处理:

    • 优点:平衡了内存使用和处理效率
    • 缺点:需要合理设置块大小

使用建议

  1. 对于简单的单字符替换,使用基础的replace方法
  2. 对于需要处理大文件的情况,使用生成器或分块处理方案
  3. 对于复杂的替换规则,使用正则表达式方案
  4. 对于内存敏感的场景,优先考虑分块处理或生成器方案