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,导致在迭代过程中使用了已变换的字符。