题解
第一时间想到回溯,因为这种找全部的解,常规都是使用回溯
回溯
-
初始化词典 p h o n e = { " 2 " : [ " a " , " b " , " c " ] , ⋯ } phone=\{"2":["a","b","c"],\cdots\} phone={"2":["a","b","c"],⋯},初始化 r e s = [ ] res=[] res=[]
-
特判,若字符串为空,返回 [ ] [] []
-
定义回溯函数 h e l p e r ( s , t m p ) helper(s,tmp) helper(s,tmp): s s s表示待匹配的字符串, t m p tmp tmp表示之前匹配的结果
- 若 s = = " " s=="" s=="":表示匹配完毕,此时将 t m p tmp tmp加入 r e s res res,并返回
- 遍历
s
[
0
]
s[0]
s[0]对应的所有可能的字母
c
c
c:
- 执行 h e l p e r ( s [ i + 1 , . . . ] , t m p + c ) helper(s[i+1,...],tmp+c) helper(s[i+1,...],tmp+c)
-
执行 h e l p e r ( d i g i t s , " " ) helper(digits,"") helper(digits,"")
-
返回 r e s res res
复杂度分析
- 时间复杂度: O ( 3 N ∗ 4 M ) O(3^{N}*4^{M}) O(3N∗4M),其中 N 是输入数字中对应 3 个字母的数目(比方说 2,3,4,5,6,8), M 是输入数字中对应 4 个字母的数目(比方说 7,9),N+M 是输入数字的总数
- 空间复杂度: O ( 3 N ∗ 4 M ) O(3^{N}*4^{M}) O(3N∗4M)
Python
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
phone = {'2': ['a', 'b', 'c'],
'3': ['d', 'e', 'f'],
'4': ['g', 'h', 'i'],
'5': ['j', 'k', 'l'],
'6': ['m', 'n', 'o'],
'7': ['p', 'q', 'r', 's'],
'8': ['t', 'u', 'v'],
'9': ['w', 'x', 'y', 'z']}
if(not digits):
return []
res=[]
def helper(s,tmp):
if(s==""):
res.append(tmp)
return
for c in phone[s[0]]:
helper(s[1:],tmp+c)
helper(digits,"")
return res