小D的 abc 变换问题|豆包MarsCode AI刷题

134 阅读2分钟

1.题目

问题描述 小D拿到了一个仅由 "abc" 三种字母组成的字符串。她每次操作会对所有字符同时进行以下变换:

将 'a' 变成 'bc' 将 'b' 变成 'ca' 将 'c' 变成 'ab' 小D将重复该操作 k 次。你的任务是输出经过 k 次变换后,得到的最终字符串。

例如:对于初始字符串 "abc",执行 2 次操作后,字符串将变为 "caababbcbcca"。

测试样例 样例1:

输入:s = "abc", k = 2 输出:'caababbcbcca'

样例2:

输入:s = "abca", k = 3 输出:'abbcbccabccacaabcaababbcabbcbcca'

样例3:

输入:s = "cba", k = 1 输出:'abcabc'

先看一个样例 输入:s = "abc", k = 2 输出:'caababbcbcca' 经过变换后确实与输出一致 在这里插入图片描述

2.思路

  • 循环k次,遍历字符串,对a,b,c做相应的替换
  • 后面发现Python中的replace()可以直接对「所有」匹配到的字符串进行替换,可省去遍历字符串的步骤,直接replace()三次即可。
  • replace()用法: string.replace( old, new, count ) old :(必选,字符串类型)被替换的字符串 new :(必选,字符串类型)替换后的字符串 count :(可选,整型)替换的次数
  • 同时注意Python中字符串不可变,需要把replace()过后的字符串再赋给原字符串。

3.代码

    # write code here
    for _ in range(k):
        s = s.replace("a", "bc")
        s = s.replace("b", "ca")
        s = s.replace("c", "ab")
    return s

这里结果有误,应该是如果一次替换所有的,s = s.replace("a", "bc"),那下一条reolece语句会在次基础上替换,替换得会比原来多,和题目逻辑不符。 在这里插入图片描述 这里就可以看出问题了,所以仍旧需要遍历字符串,确保在一次循环内,字符串只被扫描一次 这里使用切片来替换字符串

def solution(s: str, k: int) -> str:
    # write code here
    for _ in range(k):
        for i in range(len(s)):
            if s[i] == 'a':
                s = s[: i] + 'bc' + s[i + 1: ]
            elif s[i] == 'b':
                s = s[: i] + 'ca' + s[i + 1: ]
            elif s[i] == 'c':
                s = s[: i] + 'ab' + s[i + 1: ]
    return s

这个逻辑仍然有问题,因为这样子s会变,下一次访问到的就不是原字串的下一个值了,可以用一个列表来存放每次更新后的字符串,并用它替代s

def solution(s: str, k: int) -> str:
    # write code here
    for _ in range(k):
        new_s = []
        for c in s:
            if c == 'a':
                new_s.append('bc')
            elif c == 'b':
                new_s.append('ca')
            elif c == 'c':
                new_s.append('ab')
        s = ''.join(new_s)
    return s
if __name__ == '__main__':
    print(solution("abc", 2))
    print(solution("abc", 2) == 'caababbcbcca')
    print(solution("abca", 3) == 'abbcbccabccacaabcaababbcabbcbcca')
    print(solution("cba", 1) == 'abcabc')   

在这里插入图片描述

4.总结

这道题思路简单,一眼便有思路,但真正写起来是有陷阱的,你必须保证在每次变换时不直接修改字符串 s,导致在迭代过程中使用了已变换的字符。

5.参考资料

Python replace()函数使用详解,Python替换字符串

python 字符串按位置替换 - 51CTO博客