所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。

思路分析:本题需要解决的问题有三个:
const string letterMap[10] = {
"", // 0
"", // 1
"abc", // 2
"def", // 3
"ghi", // 4
"jkl", // 5
"mno", // 6
"pqrs", // 7
"tuv", // 8
"wxyz" // 9
};
第二个组合问题可以参考【算法与数据结构】77、LeetCode组合,稍做修改, 程序当中index来表示当前递归正在处理的数字的索引,终止条件为处理的索引=digits大小。同时利用ASCII码直接减去‘0’得到对应的数字,并且做了异常值的处理,大于‘9’小于‘0’就是异常值。
程序如下:
class Solution {
private:
vector<string> result; // 结果合集
string path;
void backtracking(const string& digits, int index) { // index表示当前处理的数字索引
if (index == digits.size()) { // 终止条件
result.push_back(path);
return;
}
if (digits[index] > '9' || digits[index] < '0') { // 异常处理
result.clear();
result.push_back("input_error");
return;
}
else {
int digit = digits[index] - '0';
string letter = letterMap[digit];
for (int i = 0; i < letter.size(); i++) { // 剪枝优化
path += letter[i]; // 处理节点
backtracking(digits, index + 1); // 递归
path.pop_back(); // 回溯,撤销处理的节点
}
}
}
public:
const string letterMap[10] = {
"", // 0
"", // 1
"abc", // 2
"def", // 3
"ghi", // 4
"jkl", // 5
"mno", // 6
"pqrs", // 7
"tuv", // 8
"wxyz" // 9
};
vector<string> letterCombinations(string digits) {
if(digits.size()) backtracking(digits, 0);
return result;
}
};
复杂度分析:
# include
# include
# include
using namespace std;
class Solution {
private:
vector<string> result; // 结果合集
string path;
void backtracking(const string& digits, int index) { // index表示当前处理的数字索引
if (index == digits.size()) { // 终止条件
result.push_back(path);
return;
}
if (digits[index] > '9' || digits[index] < '0') { // 异常处理
result.clear();
result.push_back("input_error");
return;
}
else {
int digit = digits[index] - '0';
string letter = letterMap[digit];
for (int i = 0; i < letter.size(); i++) { // 剪枝优化
path += letter[i]; // 处理节点
backtracking(digits, index + 1); // 递归
path.pop_back(); // 回溯,撤销处理的节点
}
}
}
public:
const string letterMap[10] = {
"", // 0
"", // 1
"abc", // 2
"def", // 3
"ghi", // 4
"jkl", // 5
"mno", // 6
"pqrs", // 7
"tuv", // 8
"wxyz" // 9
};
vector<string> letterCombinations(string digits) {
if(digits.size()) backtracking(digits, 0);
return result;
}
};
int main() {
string digits = "*";
Solution s1;
vector<string> result = s1.letterCombinations(digits);
for (vector<string>::iterator jt = result.begin(); jt != result.end(); jt++) {
cout << *jt << " ";
}
cout << endl;
system("pause");
return 0;
}
end