mirror of
https://github.com/SunnyQjm/algorithm-review.git
synced 2026-06-03 08:16:43 +08:00
58 lines
2.2 KiB
Python
58 lines
2.2 KiB
Python
#!/usr/bin/env python
|
|
# coding=utf-8
|
|
|
|
########################################################################################################
|
|
# Leetcode 17 电话号码的字母组合
|
|
# https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/
|
|
#
|
|
# 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
|
|
# 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
|
|
#
|
|
# 示例:
|
|
# 输入:"23"
|
|
# 输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
|
|
#
|
|
# 说明:
|
|
# 尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
|
|
########################################################################################################
|
|
|
|
class Solution:
|
|
numMap = {'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]
|
|
|
|
(Knowledge)
|
|
|
|
思路:
|
|
1. 这是一个回溯问题,且没有最优子结构,不能用动态规划,所以可以使用回溯框架用递归方式解决;
|
|
回溯框架套路看这里 => https://labuladong.gitbook.io/algo/di-ling-zhang-bi-du-xi-lie/hui-su-suan-fa-xiang-jie-xiu-ding-ban
|
|
"""
|
|
def _letterCombinations(path, digits, index, result):
|
|
"""
|
|
:type path: str => 当前路径
|
|
:type digits: str => 原数字字符串
|
|
:type index: int => 当前遍历位置
|
|
:type result: List[str] => 存储结果
|
|
"""
|
|
if index == len(digits) - 1:
|
|
for ch in self.numMap[digits[index]]:
|
|
result.append(path + ch)
|
|
return
|
|
|
|
for ch in self.numMap[digits[index]]:
|
|
_letterCombinations(path + ch, digits, index + 1, result)
|
|
|
|
# 对空字符串进行特判
|
|
if not digits:
|
|
return []
|
|
result = []
|
|
_letterCombinations("", digits, 0, result)
|
|
return result
|
|
|
|
|
|
if __name__ == '__main__':
|
|
solution = Solution()
|
|
print(solution.letterCombinations("23"), '= ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]')
|