Description
Given a string containing digits from 2-9
inclusive, return all possible letter combinations that the number could represent.
A mapping of digit to letters (just like on the telephone buttons) is given below. Note that 1 does not map to any letters.
Example:
Input: "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
Note:
Although the above answer is in lexicographical order, your answer could be in any order you want.
Solutions
题意比较明确,就是按照,按键的数字对应看能拼出多少种字母的组合。
1. DFS
看到这样全部输出的题目一般都是模板题,用 DFS 来做。画出树的时候,node 按键上的数字,边是按键能够打出的字符。搜索树的每一条完整的路径就是一个结果,以下通过 DFS 方法来解决:
# Time: O(3^n)
# Space: O(n)
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
if digits is None or digits == '':
return []
mapping = {'0':' ', '1':'', '2':'abc', '3':'def', '4':'ghi', '5':'jkl', '6':'mno', '7':'pqrs', '8':'tuv', '9':'wxyz'}
res = []
self.dfs(mapping, digits, 0, '', res)
return res
def dfs(self, mapping, digits, level, cur, res):
if level == len(digits):
res.append(cur)
return
for c in mapping[digits[level]]:
self.dfs(mapping, digits, level + 1, cur + c, res)
接下来用 BFS 的方式求解:
class Solution(object):
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
if digits is None or digits == '':
return []
mapping = {'0':' ', '1':'', '2':'abc', '3':'def', '4':'ghi', '5':'jkl', '6':'mno', '7':'pqrs', '8':'tuv', '9':'wxyz'}
ans = ['']
for digit in digits:
tmp = []
for s in ans:
for c in mapping[digit]:
tmp.append(s + c)
ans = tmp
return ans
# Runtime: 8 ms, faster than 99.74% of Python online submissions for Letter Combinations of a Phone Number.
# Memory Usage: 11.7 MB, less than 62.53% of Python online submissions for Letter Combinations of a Phone Number.
看到解法中还要直接用递归求解:
class Solution(object):
def letterCombinations(self, digits):
'''
:type digits: str
:rtype: 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']}
result = []
def helpCombine(current, leftoverDigits):
if not leftoverDigits:
result.append(current)
return
else:
for char in phone[leftoverDigits[0]]:
helpCombine(current + char, leftoverDigits[1:])
if not digits:
return []
else:
helpCombine("", digits)
return result
# Runtime: 20 ms, faster than 70.29% of Python online submissions for Letter Combinations of a Phone Number.
# Memory Usage: 11.8 MB, less than 44.24% of Python online submissions for Letter Combinations of a Phone Number.