leetcode 第17题 解题分析
这道题目是一道经典的回溯算法题,主要目的为寻找出最多解。
回溯算法本质就是递归的调用,整体表现为一个树形结构
下面是代码部分
def letterCombinations(digits: str):
leeterMap = ["","","abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]
# 保存0-9 分别对应的字母
res = list()
def find_combination(digits, index: int, s: str):
# 递归部分
if (index == len(digits)):
res.append(s)
return
c = digits[index]
if (c >= '0' and c <= '9' and c != '1'):
leeters = leeterMap[ord(c) - ord('0')]
for i in range(len(leeters)):
find_combination(digits, index + 1, s + leeters[i])
if (len(digits) == 0):
return []
find_combination(digits, 0, "")
return res
digits = '23'
a = letterCombinations(digits)
print(a)
递归的第一步,首先设置一个递归的结束条件
if (index == len(digits)): # 当返回字符串长度与数字串长度相同时,返回值
res.append(s)
return
在递归终止,返回值时,我先定义了一个数组,用来保存返回的字符串。
结束条件定义完毕后,便开始定义函数主体了。
c = digits[index] # 获取数字串中的数字
if (c >= '0' and c <= '9' and c != '1'):
leeters = leeterMap[ord(c) - ord('0')] # 判断数字对应的字符串
for i in range(len(leeters)): #使用for循环,依次组合字符串
find_combination(digits, index + 1, s + leeters[i])
根据我的理解,这里for循环与递归的组合,本质上,就是,在做一些固定组合问题时使用for循环的方法,只不过,在做固定组合问题时,for循环的次数,自己是可知的,但在这里,却是以一个动态形式存在,只有当数的枝杈完全到达底部后,才会开始返回值,多看几遍,基本上就理解了,在这之前,尽量将递归的知识补充完全,做这道题,才会得心应手。
回溯本身也是属于暴力解法,所以时间复杂度可想而知,不过,我觉得,它在解决有些问题上,非它不可。