diff --git a/problems/0017.电话号码的字母组合.md b/problems/0017.电话号码的字母组合.md index 15a486f2..270398fb 100644 --- a/problems/0017.电话号码的字母组合.md +++ b/problems/0017.电话号码的字母组合.md @@ -282,61 +282,74 @@ class Solution { ``` ## Python - -```Python +**回溯** +```python3 class Solution: - ans = [] - s = '' - letterMap = { - '2': 'abc', - '3': 'def', - '4': 'ghi', - '5': 'jkl', - '6': 'mno', - '7': 'pqrs', - '8': 'tuv', - '9': 'wxyz' - } + def __init__(self): + self.answers: List[str] = [] + self.answer: str = '' + self.letter_map = { + '2': 'abc', + '3': 'def', + '4': 'ghi', + '5': 'jkl', + '6': 'mno', + '7': 'pqrs', + '8': 'tuv', + '9': 'wxyz' + } - def letterCombinations(self, digits): - self.ans.clear() - if digits == '': - return self.ans - self.backtracking(digits, 0) - return self.ans - - def backtracking(self, digits, index): - if index == len(digits): - self.ans.append(self.s) - return - else: - letters = self.letterMap[digits[index]] # 取出数字对应的字符集 - for letter in letters: - self.s = self.s + letter # 处理 - self.backtracking(digits, index + 1) - self.s = self.s[:-1] # 回溯 -``` - -python3: - -```py -class Solution: def letterCombinations(self, digits: str) -> List[str]: - res = [] - s = "" - letterMap = ["","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"] - if not len(digits): return res - def backtrack(digits,index, s): - if index == len(digits): - return res.append(s) - digit = int(digits[index]) #将index指向的数字转为int - letters = letterMap[digit] #取数字对应的字符集 - for i in range(len(letters)): - s += letters[i] - backtrack(digits, index+1, s) #递归,注意index+1,一下层要处理下一个数字 - s = s[:-1] #回溯 - backtrack(digits, 0, s) - return res + self.answers.clear() + if not digits: return [] + self.backtracking(digits, 0) + return self.answers + + 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] # 回溯 +``` +**回溯简化** +```python3 +class Solution: + def __init__(self): + self.answers: List[str] = [] + self.letter_map = { + '2': 'abc', + '3': 'def', + '4': 'ghi', + '5': 'jkl', + '6': 'mno', + '7': 'pqrs', + '8': 'tuv', + '9': 'wxyz' + } + + def letterCombinations(self, digits: str) -> List[str]: + self.answers.clear() + if not digits: return [] + self.backtracking(digits, 0, '') + return self.answers + + def backtracking(self, digits: str, index: int, answer: str) -> None: + # 回溯函数没有返回值 + # Base Case + if index == len(digits): # 当遍历穷尽后的下一层时 + self.answers.append(answer) + return + # 单层递归逻辑 + letters: str = self.letter_map[digits[index]] + for letter in letters: + self.backtracking(digits, index + 1, answer + letter) # 递归至下一层 + 回溯 ```