116、【回溯算法】leetcode ——17. 电话号码的字母组合:回溯法:哈希映射+字符串数组映射(C++版本)
2023-09-11 14:20:01 时间
题目描述
原题链接:17. 电话号码的字母组合
解题思路
- 构建电话数字和字母映射关系
- 回溯操作,选择一个数字的中对应的一个字母。
哈希表映射
用Hash表构建字符型数字和字母的映射关系。
class Solution {
public:
// 记录结果集
vector<string> res;
// 构建电话数字和字母的映射关系
void buildNumString(map<char, string> &table) {
char startIndex = 'a';
for(char i = '2'; i <= '9'; i++) {
string s = "";
char ch = startIndex;
while(ch <= startIndex + 2 && ch <= 'z') {
s += ch++;
}
if(i == '7') {
ch = 't';
s += 's';
}
startIndex = ch;
table[i] = s;
}
table['9'] += "z";
}
// digits:输入数字,s:已记录对应字母,startIndex:起始下标,table:映射表
void backtracking(string digits, string s, int startIndex, map<char, string> table) {
if(s.size() == digits.size()) {
res.push_back(s);
}
// 外层遍历输入的数字,内层遍历每个数字对应的字母,每次更新起始下标
for(int i = startIndex; i < digits.size(); i++) {
for(int j = 0; j < table[digits[i]].size(); j++) {
backtracking(digits, s + table[digits[i]][j], i + 1, table);
}
}
}
vector<string> letterCombinations(string digits) {
if(digits.size() == 0) return {};
map<char, string> table;
buildNumString(table);
backtracking(digits, "", 0, table);
return res;
}
};
代码优化:字符串数组映射
将Hash表改用string数组,降低空间复杂度、提高了存储效率。
class Solution {
public:
// 记录结果集
vector<string> res;
// 构建电话数字和字母的映射关系
void buildNumString(string table[]) {
table[0] = "";
table[1] = "";
char startIndex = 'a';
for(int i = 2; i <= 9; i++) {
string s = "";
char ch = startIndex;
while(ch <= startIndex + 2 && ch <= 'z') {
s += ch++;
}
if(i == 7) {
ch = 't';
s += 's';
}
startIndex = ch;
table[i] = s;
}
table[9] += "z";
}
// digits:输入数字,s:已记录对应字母,startIndex:遍历的数字下标,table:映射表
void backtracking(string digits, string s, int startIndex, string table[]) {
if(s.size() == digits.size()) {
res.push_back(s);
return ;
}
// 获取遍历的数字和对应的字母串
int digit = digits[startIndex] - '0';
string letters = table[digit];
// 遍历该数字对应的字母串
for(int i = 0; i < letters.size(); i++) {
backtracking(digits, s + letters[i], startIndex + 1, table);
}
}
vector<string> letterCombinations(string digits) {
if(digits.size() == 0) return {};
string table[10];
buildNumString(table);
backtracking(digits, "", 0, table);
return res;
}
};
参考文章:17.电话号码的字母组合
相关文章
- 《LeetCode刷题C/C++版答案》pdf出炉,白瞟党乐坏了
- 《从缺陷中学习C/C++》——6.15 试图产生的指针很可能不存在
- 《C++代码设计与重用》——1.5 这本书能给我们带来什么
- 【C++】优先级队列priority_queue/仿函数(函数对象)
- 181、【动态规划】leetcode ——72. 编辑距离(C++版本)
- 173、【动态规划】leetcode ——300. 最长递增子序列 (C++版本)
- 137、【贪心算法】leetcode ——406. 根据身高重建队列(多维度贪心)(C++版本)
- 132、【贪心算法】leetcode ——45. 跳跃游戏 II(贪心策略)(C++版本)
- 131、【贪心算法】leetcode ——55. 跳跃游戏(贪心策略)(C++版本)
- 129、【动态规划/贪心算法】leetcode ——53. 最大子数组和(C++版本)
- 123、【回溯算法】leetcode ——491. 递增子序列:unordered_set去重和int数组去重(C++版本)
- 121、【回溯算法】leetcode ——78. 子集(C++版本)
- 108、【树与二叉树】leetcode ——235. 二叉搜索树的最近公共祖先:普通树解法+BST性质解法(C++版本)
- 97、【树与二叉树】leetcode ——513.找树左下角的值:层次遍历+回溯法(C++版本)
- 81、【栈与队列】leetcode ——232. 用栈实现队列(C++版本)
- 74、【数组】leetcode——18. 四数之和(C++版本)
- 73、【数组】leetcode——15. 三数之和(C++/Python版本)
- C/C++教程 第二十章 —— Qt使用入门
- LeetCode //C++ Palindrome Number