一、题目描述

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

【LeetCode】17. 电话号码的字母组合_leetcode


示例:

输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

二、解题思路 & 代码

2.1 回溯

回溯的思想 只不过这题不需要剪枝而已(没有重复解,所有叶子结点都是解) 所以和通常看到的回溯法有点不一样

class Solution:
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']}

def backtrack(combination, next_digits):
# if there is no more digits to check
if len(next_digits) == 0:
# the combination is done
output.append(combination)
# if there are still digits to check
else:
# iterate over all letters which map
# the next available digit
for letter in phone[next_digits[0]]:
# append the current letter to the combination
# and proceed to the next digits
backtrack(combination + letter, next_digits[1:])

output = []
if digits:
backtrack("", digits)
return

复杂度分析

  1. 时间复杂度:【LeetCode】17. 电话号码的字母组合_算法_02,其中 N 是输入数字中对应 3 个字母的数目(比方说 2,3,4,5,6,8), M 是输入数字中对应 4 个字母的数目(比方说 7,9),N+M 是输入数字的总数。
  2. 空间复杂度:【LeetCode】17. 电话号码的字母组合_算法_02 ,这是因为需要保存 【LeetCode】17. 电话号码的字母组合_算法_02

参考:
​​​LeetCode官方题解​

2.2 队列

class Solution(object):
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
if not digits:
return []
# 一个映射表,第二个位置是"abc“,第三个位置是"def"。。。
# 这里也可以用map,用数组可以更节省点内存
d = [" ","*","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]
# 先往队列中加入一个空字符
res = [""]
for i in digits:
size = len(res)
# 由当前遍历到的字符,取字典表中查找对应的字符串
letters = d[ord(i)-48]
# 计算出队列长度后,将队列中的每个元素挨个拿出来
for _ in range(size):
# 每次都从队列中拿出第一个元素
tmp = res.pop(0)
# 然后跟"def"这样的字符串拼接,并再次放到队列中
for j in letters:
res.append(tmp+j)
return

参考:​​LeetCode题解​