mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-11 21:10:58 +08:00
Update 0017.电话号码的字母组合.md
This commit is contained in:
@ -285,98 +285,153 @@ class Solution {
|
|||||||
```
|
```
|
||||||
|
|
||||||
## Python
|
## Python
|
||||||
**回溯**
|
回溯
|
||||||
```python
|
```python
|
||||||
class Solution:
|
class Solution:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.answers: List[str] = []
|
self.letterMap = [
|
||||||
self.answer: str = ''
|
"", # 0
|
||||||
self.letter_map = {
|
"", # 1
|
||||||
'2': 'abc',
|
"abc", # 2
|
||||||
'3': 'def',
|
"def", # 3
|
||||||
'4': 'ghi',
|
"ghi", # 4
|
||||||
'5': 'jkl',
|
"jkl", # 5
|
||||||
'6': 'mno',
|
"mno", # 6
|
||||||
'7': 'pqrs',
|
"pqrs", # 7
|
||||||
'8': 'tuv',
|
"tuv", # 8
|
||||||
'9': 'wxyz'
|
"wxyz" # 9
|
||||||
}
|
]
|
||||||
|
self.result = []
|
||||||
def letterCombinations(self, digits: str) -> List[str]:
|
self.s = ""
|
||||||
self.answers.clear()
|
|
||||||
if not digits: return []
|
def backtracking(self, digits, index):
|
||||||
|
if index == len(digits):
|
||||||
|
self.result.append(self.s)
|
||||||
|
return
|
||||||
|
digit = int(digits[index]) # 将索引处的数字转换为整数
|
||||||
|
letters = self.letterMap[digit] # 获取对应的字符集
|
||||||
|
for i in range(len(letters)):
|
||||||
|
self.s += letters[i] # 处理字符
|
||||||
|
self.backtracking(digits, index + 1) # 递归调用,注意索引加1,处理下一个数字
|
||||||
|
self.s = self.s[:-1] # 回溯,删除最后添加的字符
|
||||||
|
|
||||||
|
def letterCombinations(self, digits):
|
||||||
|
if len(digits) == 0:
|
||||||
|
return self.result
|
||||||
self.backtracking(digits, 0)
|
self.backtracking(digits, 0)
|
||||||
return self.answers
|
return self.result
|
||||||
|
|
||||||
def backtracking(self, digits: str, index: int) -> None:
|
|
||||||
# 回溯函数没有返回值
|
|
||||||
# Base Case
|
|
||||||
if index == len(digits): # 当遍历穷尽后的下一层时
|
|
||||||
self.answers.append(self.answer)
|
|
||||||
return
|
|
||||||
# 单层递归逻辑
|
|
||||||
letters: str = self.letter_map[digits[index]]
|
|
||||||
for letter in letters:
|
|
||||||
self.answer += letter # 处理
|
|
||||||
self.backtracking(digits, index + 1) # 递归至下一层
|
|
||||||
self.answer = self.answer[:-1] # 回溯
|
|
||||||
```
|
```
|
||||||
**回溯简化**
|
回溯精简(版本一)
|
||||||
```python
|
```python
|
||||||
class Solution:
|
class Solution:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.answers: List[str] = []
|
self.letterMap = [
|
||||||
self.letter_map = {
|
"", # 0
|
||||||
'2': 'abc',
|
"", # 1
|
||||||
'3': 'def',
|
"abc", # 2
|
||||||
'4': 'ghi',
|
"def", # 3
|
||||||
'5': 'jkl',
|
"ghi", # 4
|
||||||
'6': 'mno',
|
"jkl", # 5
|
||||||
'7': 'pqrs',
|
"mno", # 6
|
||||||
'8': 'tuv',
|
"pqrs", # 7
|
||||||
'9': 'wxyz'
|
"tuv", # 8
|
||||||
}
|
"wxyz" # 9
|
||||||
|
]
|
||||||
def letterCombinations(self, digits: str) -> List[str]:
|
self.result = []
|
||||||
self.answers.clear()
|
|
||||||
if not digits: return []
|
|
||||||
self.backtracking(digits, 0, '')
|
|
||||||
return self.answers
|
|
||||||
|
|
||||||
def backtracking(self, digits: str, index: int, answer: str) -> None:
|
def getCombinations(self, digits, index, s):
|
||||||
# 回溯函数没有返回值
|
if index == len(digits):
|
||||||
# Base Case
|
self.result.append(s)
|
||||||
if index == len(digits): # 当遍历穷尽后的下一层时
|
return
|
||||||
self.answers.append(answer)
|
digit = int(digits[index])
|
||||||
return
|
letters = self.letterMap[digit]
|
||||||
# 单层递归逻辑
|
|
||||||
letters: str = self.letter_map[digits[index]]
|
|
||||||
for letter in letters:
|
for letter in letters:
|
||||||
self.backtracking(digits, index + 1, answer + letter) # 递归至下一层 + 回溯
|
self.getCombinations(digits, index + 1, s + letter)
|
||||||
|
|
||||||
|
def letterCombinations(self, digits):
|
||||||
|
if len(digits) == 0:
|
||||||
|
return self.result
|
||||||
|
self.getCombinations(digits, 0, "")
|
||||||
|
return self.result
|
||||||
|
|
||||||
```
|
```
|
||||||
**使用itertools**
|
回溯精简(版本二)
|
||||||
```python
|
```python
|
||||||
class Solution:
|
class Solution:
|
||||||
def letterCombinations(self, digits: str) -> List[str]:
|
def __init__(self):
|
||||||
import itertools
|
self.letterMap = [
|
||||||
if not digits:
|
"", # 0
|
||||||
return list()
|
"", # 1
|
||||||
|
"abc", # 2
|
||||||
phoneMap = {
|
"def", # 3
|
||||||
"2": "abc",
|
"ghi", # 4
|
||||||
"3": "def",
|
"jkl", # 5
|
||||||
"4": "ghi",
|
"mno", # 6
|
||||||
"5": "jkl",
|
"pqrs", # 7
|
||||||
"6": "mno",
|
"tuv", # 8
|
||||||
"7": "pqrs",
|
"wxyz" # 9
|
||||||
"8": "tuv",
|
]
|
||||||
"9": "wxyz",
|
|
||||||
}
|
def getCombinations(self, digits, index, s, result):
|
||||||
|
if index == len(digits):
|
||||||
|
result.append(s)
|
||||||
|
return
|
||||||
|
digit = int(digits[index])
|
||||||
|
letters = self.letterMap[digit]
|
||||||
|
for letter in letters:
|
||||||
|
self.getCombinations(digits, index + 1, s + letter, result)
|
||||||
|
|
||||||
|
def letterCombinations(self, digits):
|
||||||
|
result = []
|
||||||
|
if len(digits) == 0:
|
||||||
|
return result
|
||||||
|
self.getCombinations(digits, 0, "", result)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
groups = (phoneMap[digit] for digit in digits)
|
|
||||||
return ["".join(combination) for combination in itertools.product(*groups)]
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
回溯优化使用列表
|
||||||
|
```python
|
||||||
|
class Solution:
|
||||||
|
def __init__(self):
|
||||||
|
self.letterMap = [
|
||||||
|
"", # 0
|
||||||
|
"", # 1
|
||||||
|
"abc", # 2
|
||||||
|
"def", # 3
|
||||||
|
"ghi", # 4
|
||||||
|
"jkl", # 5
|
||||||
|
"mno", # 6
|
||||||
|
"pqrs", # 7
|
||||||
|
"tuv", # 8
|
||||||
|
"wxyz" # 9
|
||||||
|
]
|
||||||
|
|
||||||
|
def getCombinations(self, digits, index, path, result):
|
||||||
|
if index == len(digits):
|
||||||
|
result.append(''.join(path))
|
||||||
|
return
|
||||||
|
digit = int(digits[index])
|
||||||
|
letters = self.letterMap[digit]
|
||||||
|
for letter in letters:
|
||||||
|
path.append(letter)
|
||||||
|
self.getCombinations(digits, index + 1, path, result)
|
||||||
|
path.pop()
|
||||||
|
|
||||||
|
def letterCombinations(self, digits):
|
||||||
|
result = []
|
||||||
|
if len(digits) == 0:
|
||||||
|
return result
|
||||||
|
self.getCombinations(digits, 0, [], result)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Go
|
## Go
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user