leetcode 17. 电话号码的字母组合
题目
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
代码
class Solution:
def letterCombinations(self, digits: str):
"""
:param digits: string
:return: list[str]
"""
stack = []
if not len(digits):
return stack
tmp = []
digLetterDist = {"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"]}
n = len(digits)
for i, c in enumerate(digits):
if i == 0:
for letter in digLetterDist[c]:
stack.append(letter)
else:
while stack:
stack_pop = stack.pop()
for letter in digLetterDist[c]:
tmp.append(stack_pop + letter)
while tmp:
tmp_pop = tmp.pop()
stack.append(tmp_pop)
return stack
solution = Solution()
a = solution.letterCombinations("23")
print(a)
解析:
利用两个栈,一个结果栈stack,一个中转栈tmp
1.首先,做一个数字-字母映射字典。
digLetterDist = {"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"]}
1.假设当前按第i个键,则stack存放按前i-1个键的所有输入组合,把stack中的元素逐个弹出,与第i个键(假设是3,则输入可能为“d”,“e”,“f”)的所有可能进行结合,把结合后的元素都压入tmp。
while stack:
stack_pop = stack.pop()
for letter in digLetterDist[c]:
tmp.append(stack_pop + letter)
2.stack的元素都为空时,说明第i次按键输入的所有可能都得到了,把tmp的所有元素移到stack中。
while tmp:
tmp_pop = tmp.pop()
stack.append(tmp_pop)
3.继续处理下一次按键。