我正在为我的面试做准备。我正在解决的问题是如何获取电话号码的所有字母组合。
给定一个包含从2到9的数字的字符串,返回该数字可能表示的所有可能的字母组合。下面给出了数字与字母的映射关系(就像在电话按钮上一样)。请注意,数字1没有映射到任何字母。
这是问题,数字与字母的映射关系如下:
nums = {
'2':'abc',
'3':'def',
'4':'ghi',
'5':'jkl',
'6':'mno',
'7':'pqrs',
'8':'tuv',
'9':'wxyz'
}
我对这个问题的解决方案如下:
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
letters = {'2':'abc', '3':'def','4':'ghi', '5':'jkl', '6':'mno', '7':'pqrs','8':'tuv', '9':'wxyz'}
def backtrack(digits, path, res):
if digits == '':
res.append(path)
return
for n in digits:
for letter in letters[n]:
path += letter
backtrack(digits[1:], path, res)
path = path[:-1]
res = []
backtrack(digits, '', res)
return res
输入
"23"
的正确答案应该是 ["ad","ae","af","bd","be","bf","cd","ce","cf"]
,但我的答案看起来像是 ["ad","ae","af","bd","be","bf","cd","ce","cf","dd","de","df","ed","ee","ef","fd","fe","ff"]
。在得到所有期望的组合后,它仍然会得到包含重复字母的组合,如dd
、de
、ee
等。
我不明白为什么会发生这种情况,因为我只是试图通过每个数字的可能字母,并在此之后终止。引起这个问题的原因是什么?
["".join(combo) for combo in itertools.product(*[letters[d] for d in digits])]
。其中itertools.product
函数用于返回所有可迭代对象中元素的笛卡尔积,使用列表推导式将每个数字对应的字母列表作为参数传递给product
函数,然后再用join
函数将组合成字符串。 - DYZ