递归与迭代的运用
题目如下:
小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'
思路:
使用递归或迭代的方法来解决这个问题。每次操作会对所有字符同时进行变换,因此我们需要在每次操作中生成新的字符串,然后继续进行下一次操作,直到完成 k 次操作。
- 定义变换规则:将
'a'变成'bc',将'b'变成'ca',将'c'变成'ab'。 - 迭代变换:使用一个循环来执行
k次变换,每次生成新的字符串。 - 返回最终结果:经过
k次变换后,返回最终的字符串。
代码如下
def solution(s: str, k: int) -> str:
# 定义变换规则
transform_rules = {
'a': 'bc',
'b': 'ca',
'c': 'ab'
}
# 迭代执行 k 次变换
for _ in range(k):
new_s = ''.join(transform_rules[char] for char in s)
s = new_s
return s
测试样例
if name == "main": # 样例1 s1 = "abc" k1 = 2 print(transform_string(s1, k1)) # 输出:'caababbcbcca'
# 样例2
s2 = "abca"
k2 = 3
print(transform_string(s2, k2)) # 输出:'abbcbccabccacaabcaababbcabbcbcca'
# 样例3
s3 = "cba"
k3 = 1
print(transform_string(s3, k3)) # 输出:'abcabc'# write code here
代码解释
-
定义变换规则:
- 使用字典
transform_rules来定义每个字符的变换规则。 'a'变成'bc''b'变成'ca''c'变成'ab'
- 使用字典
-
迭代变换:
- 使用
for循环执行k次变换。 - 在每次变换中,使用列表推导式和
join方法生成新的字符串new_s,其中每个字符都根据transform_rules进行变换。 - 将生成的新字符串
new_s赋值给s,以便在下一次迭代中继续变换。
- 使用
-
返回最终结果:
- 经过
k次变换后,返回最终的字符串s。
- 经过
测试样例
-
样例1:
- 输入:
s = "abc",k = 2 - 输出:
'caababbcbcca' - 解释:第一次变换后,
"abc"变成"bccaab";第二次变换后,"bccaab"变成"caababbcbcca"。
- 输入:
-
样例2:
- 输入:
s = "abca",k = 3 - 输出:
'abbcbccabccacaabcaababbcabbcbcca' - 解释:经过三次变换后,字符串逐渐变长,最终结果为
'abbcbccabccacaabcaababbcabbcbcca'。
- 输入:
-
样例3:
- 输入:
s = "cba",k = 1 - 输出:
'abcabc' - 解释:第一次变换后,
"cba"变成"abcabc"。
- 输入:
测试样例解释
样例1
-
输入:
s = "abc",k = 2 -
输出:
'caababbcbcca' -
解释:
-
第一次变换后,
"abc"变成"bccaab":'a'变成'bc''b'变成'ca''c'变成'ab'
-
第二次变换后,
"bccaab"变成"caababbcbcca":'b'变成'ca''c'变成'ab''c'变成'ab''a'变成'bc''a'变成'bc''b'变成'ca'
-
样例2
-
输入:
s = "abca",k = 3 -
输出:
'abbcbccabccacaabcaababbcabbcbcca' -
解释:
-
第一次变换后,
"abca"变成"bccaabbc":'a'变成'bc''b'变成'ca''c'变成'ab''a'变成'bc'
-
第二次变换后,
"bccaabbc"变成"caababbcbccabccabcaabbc":'b'变成'ca''c'变成'ab''c'变成'ab''a'变成'bc''a'变成'bc''b'变成'ca''b'变成'ca''c'变成'ab'
-
第三次变换后,
"caababbcbccabccabcaabbc"变成"abbcbccabccacaabcaababbcabbcbcca":- 每个字符按照
transform_rules进行变换
- 每个字符按照
-
样例3
-
输入:
s = "cba",k = 1 -
输出:
'abcabc' -
解释:
-
第一次变换后,
"cba"变成"abcabc":'c'变成'ab''b'变成'ca''a'变成'bc'
-
递归
定义
递归是一种编程技术,其中一个函数在其定义中调用自身。递归通常涉及将问题分解成更小的子问题,直到达到基本情况(即不再递归的终止条件)。
优点
- 代码简洁:递归代码通常比迭代代码更简洁,更容易理解和编写。
- 自然表达:对于某些问题(如树和图的遍历),递归是自然且直观的解决方案。
缺点
- 内存消耗:每次递归调用都会在调用栈中占用一定的内存,可能导致栈溢出。
- 性能问题:递归调用的开销较大,尤其是对于深度递归,可能会导致性能下降。
示例
计算阶乘的递归实现:
python
深色版本
def factorial_recursive(n):
if n == 0:
return 1
else:
return n * factorial_recursive(n - 1)
迭代
定义
迭代是一种通过循环结构重复执行某段代码的编程技术。迭代通常使用 for 或 while 循环来实现。
优点
- 内存效率:迭代通常比递归更节省内存,因为不需要在调用栈中保存大量的函数调用。
- 性能:迭代通常比递归更快,因为没有函数调用的开销。
缺点
- 代码复杂:对于某些问题,迭代代码可能比递归代码更复杂,更难理解和编写。
- 不自然:对于某些问题,迭代可能不是最自然的解决方案。
示例
计算阶乘的迭代实现:
python
深色版本
def factorial_iterative(n):
result = 1
for i in range(1, n + 1):
result *= i
return result
选择递归还是迭代
选择递归的情况
- 问题天然适合递归:例如,树和图的遍历、分治算法(如快速排序、归并排序)等。
- 代码简洁优先:如果代码的简洁性和可读性更重要,递归可能是更好的选择。
- 问题规模较小:如果问题的规模较小,递归的内存消耗和性能问题可以忽略不计。
选择迭代的情况
- 性能和内存效率优先:如果性能和内存效率是关键因素,迭代通常是更好的选择。
- 问题规模较大:对于大规模问题,递归可能导致栈溢出,迭代更安全。
- 问题复杂度较高:对于复杂的逻辑,迭代可能更容易理解和调试。
综合示例
递归示例:斐波那契数列
python
深色版本
def fibonacci_recursive(n):
if n <= 1:
return n
else:
return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2)
迭代示例:斐波那契数列
python
深色版本
def fibonacci_iterative(n):
if n <= 1:
return n
a, b = 0, 1
for _ in range(2, n + 1):
a, b = b, a + b
return b
结论
递归和迭代各有优缺点,选择哪种方法取决于具体的问题和上下文。对于某些问题,递归可能是更自然和简洁的解决方案,而对于其他问题,迭代可能更高效和安全。