Given a digit string, 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.
Input:Digit string "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.
方法一: 42ms
使用dfs穷举
class Solution(object):
def letterCombinations(self, digits):
'''
type digits: str
rtype: list[str]
'''
def dfs(num, string, res):
if num == length: #digits的数字全部转化为letter了
res.append(string)
return
for letter in dict[digits[num]]:
dfs(num+1, string+letter, res)
dict = {'2': ['a', 'b', 'c'],
'3': ['d', 'e', 'f'],
'4': ['g', 'h', 'i'],
'5': ['j', 'k', 'l'],
'6': ['m', 'n', '0'],
'7': ['p', 'q', 'r', 's'],
'8': ['t', 'u', 'v'],
'9': ['w', 'x', 'y', 'z']
}
res = []
length = len(digits)
if length == 0:
return []
dfs(0, '', res)
return res
方法二:36ms
class Solution(object):
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
if digits=="":
return []
dic=["","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]
res=[]
self.dfs(digits,dic,res,"",0)
return res
def dfs(self,digits,dic,res,l,pos):
if pos==len(digits):
res.append(l)
return
else:
idx=int(digits[pos])
for c in dic[idx]:
self.dfs(digits,dic,res,l+c,pos+1)
方法三:35ms
这个方法没有使用dfs,而是用了3个FOR循环嵌套,= =!
class Solution(object):
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
if not digits:
return []
numToCharsMap = {
'1': [''],
'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 = numToCharsMap[digits[0]]
for i in xrange(1, len(digits)):
curr_result = []
chars = numToCharsMap[digits[i]]
for r in result:
for char in chars:
curr_result.append(r + char)
result = curr_result
return result