17. 电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。
注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明: 尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出
- 结果是所有的字符组合,而不是字符的两两组合
digits
中可能有重复的数字
一开始想着使用python内置的chr()和ord()实现字符和数字的互转,然后利用数字之间的差值来得到每个数字对应的字符,但是 2 ∼ 9 2 \sim 9 2∼9中7和9对应四个字符,这样在获取数字的字符列表时就得额外进行判断,很麻烦。
d = {}
d[2] = [ord('a'), ord('b'), ord('c')]
nums = [int(n) for n in list(digits)]
chars = []
for n in nums:
diff = n - 2
if diff == 0: c = [chr(t) for t in d[2]]
else:
c = [chr(number) for number in [t + (3 * diff) for t in d[2]]]
chars.append(c)
所以还是首先建立数字和字符之间的对应关系,这样在获取digits
对应的字符列表就一步到位,无需其他的操作。当获取到字符列表chars
后:
- 如果
chars
长度为1,则直接返回它的字符列表 - 如果
chars
长度不为1,则需要迭代的进行字符的拼接
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
d = {
'2': 'abc',
'3': 'def',
'4': 'ghi',
'5': 'jkl',
'6': 'mno',
'7': 'pqrs',
'8': 'tuv',
'9': 'wxyz',
}
if digits == None:
return None
if len(digits) == 0:
return []
nums = [int(n) for n in list(digits)]
chars = [d[str(n)] for n in nums]
if len(chars) == 1:
return [ _ for _ in list(chars[-1])]
res, midRes = [''], []
for c in chars:
for item in res:
for letter in string:
midRes.append(item + letter)
res, midRes = midRes, []
if len(res)== 0:
return []
return res