问题描述 小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'
解题思路: 很基础的模拟题
问题理解 你有一个仅由 'a', 'b', 'c' 组成的字符串 s,并且你需要对这个字符串进行 k 次变换。每次变换的规则如下:
'a' 变成 'bc' 'b' 变成 'ca' 'c' 变成 'ab' 数据结构选择 由于每次变换都会使字符串的长度增加,直接模拟这个过程可能会导致内存和时间上的问题,尤其是当 k 很大时。因此,我们需要找到一种更高效的方法来处理这个问题。
算法步骤 直接模拟:对于较小的 k,可以直接模拟每次变换的过程。 周期性分析:观察变换的周期性,可能会发现某些模式或周期性,从而减少计算量。
最终代码: def transform(s): result = "" for c in s: if c == 'a': result += "bc" elif c == 'b': result += "ca" elif c == 'c': result += "ab" return result
def solution(s, k): # 如果 k 较小,直接模拟变换 if k <= 5: for _ in range(k): s = transform(s) return s
# 如果 k 较大,尝试寻找周期性
seen = {s: 0}
# 进行变换并检查周期性
for i in range(1, k + 1):
s = transform(s)
# 检查是否出现了重复的模式
if s in seen:
# 找到周期性
cycle_start = seen[s]
cycle_length = i - cycle_start
# 计算剩余的变换次数
remaining_k = (k - cycle_start) % cycle_length
# 进行剩余的变换
for _ in range(remaining_k):
s = transform(s)
return s
# 记录当前变换结果
seen[s] = i
return s
测试样例
print(solution("abc", 2) == "caababbcbcca") print(solution("abca", 3) == "abbcbccabccacaabcaababbcabbcbcca") print(solution("cba", 1) == "abcabc")