难度:medium
回溯的题目,首先需要创建一个String类型的数组来记录电话号码对应的字符们,然后按照回溯的模板来即可,digits的长度为回溯的深度,每个数字对应的字符串的长度是回溯的宽度。要注意特殊情况的处理!
Java:
class Solution {
List<String> ans = new ArrayList<>();
String[] phoneNums = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
StringBuilder string = new StringBuilder();
public List<String> letterCombinations(String digits) {
// 我丢,忘了特殊情况
if (digits == null || digits.length() == 0) {
return ans;
}
backTracking(digits, 0);
return ans;
}
public void backTracking(String digits, int num) {
if (num == digits.length()) {
ans.add(string.toString());
return;
}
int str = digits.charAt(num) - '0';
for (int i = 0; i < phoneNums[str].length(); i++) {
string.append(phoneNums[str].charAt(i));
backTracking(digits, num + 1);
string.deleteCharAt(string.length() - 1);
}
}
}
Python:
class Solution:
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: str) -> List[str]:
if not digits:
return self.answers
self.backtracking(digits, 0)
return self.answers
def backtracking(self, digits: str, index: int) -> None:
if len(self.answer) == len(digits):
self.answers.append(self.answer)
return
letters = self.letter_map[digits[index]]
for letter in letters:
self.answer += letter
self.backtracking(digits, index + 1)
self.answer = self.answer[:-1]
复杂度分析:
- 时间复杂度:O(3^m*4^n),其中 m 是输入中对应 3 个字母的数字个数(包括数字 2、3、4、5、6、8),nn 是输入中对应 4 个字母的数字个数(包括数字 7、9),m+n 是输入数字的总个数。当输入包含 m 个对应 3 个字母的数字和 n 个对应 4 个字母的数字时,不同的字母组合一共有 3^m*4^n 种,需要遍历每一种字母组合。
- 空间复杂度:O(m+n),其中 m 是输入中对应 3 个字母的数字个数,n 是输入中对应 4 个字母的数字个数,m+n 是输入数字的总个数。除了返回值以外,空间复杂度主要取决于哈希表以及回溯过程中的递归调用层数,哈希表的大小与输入无关,可以看成常数,递归调用层数最大为 m+n。