力扣 17 电话号码的字母组合
全部刷题与学习记录
原题目
题目地址:17. 电话号码的字母组合
考查知识点
回溯三步法、字符串到字母的映射
自己的第一遍解法
同样是使用【算法套路】-【回溯篇】【回溯三步法】中提到的回溯三步法
但是刚开始使用了unordered_map来进行数字->字母的映射,所以略显麻烦,看到【代码随想录】大佬的题解回溯算法:电话号码的字母组合,原来可以使用string数组来代替unordered_map
好的解法
1、首先就是数字与字母的映射关系
const string letterMap[10] = {
"", // 0
"", // 1
"abc", // 2
"def", // 3
"ghi", // 4
"jkl", // 5
"mno", // 6
"pqrs", // 7
"tuv", // 8
"wxyz", // 9
};
2、其次就是回溯三步法
class Solution {
private:
const string letterMap[10] = {
"", // 0
"", // 1
"abc", // 2
"def", // 3
"ghi", // 4
"jkl", // 5
"mno", // 6
"pqrs", // 7
"tuv", // 8
"wxyz", // 9
};
vector<string> result;
string path;
void backTracking (const string& digits, int index) {
/*
* index: 当前的数字*/
if (index == digits.size()) {
result.push_back(path);
return;
}
int digit = digits[index] - '0'; //将当前字符形式的数字转为整型
string letters = letterMap[digit]; //取当前数字对应的字母字符串
for (char letter : letters) {
path.push_back(letter);
backTracking(digits, index + 1);
path.pop_back();
}
}
public:
vector<string> letterCombinations (string digits) {
path.clear();
result.clear();
if (digits.empty()) return result;
backTracking(digits, 0);
return result;
}
};
注意路径记录语句result.push_back(path);
这一句其实发生在最后一次路径改变语句path.push_back(letter);
之后