题目:电话号码的字母组合
题目来源:https://leetcode.cn/leetbook/read/bytedance-c01/oh7oa1/
题目内容:
- 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
- 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
回溯法
回溯属于递归的一种,在递归过程中,从某一分支的子问题回到父问题进入父问题的另一子问题分支。
C++代码实现:方法一
注:函数参数s不能使用引用方式。
class Solution {
private:
vector<string> nums;
public:
void get_sub(vector<string>&res, int i, string&digits, string s) {
if (i == digits.size()) {
res.push_back(s);
return;
}
for(int i = 0;i < nums[digits[i]-'0'].size();i++) {
s.push_back(nums[digits[i]-'0'][i]);
get_sub(res, i+1, digits, s);
s.pop_back();
}
}
vector<string> letterCombinations(string digits) {
vector<string> res;
nums = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
string s = "";
if (digits.size() == 0) return res;
get_sub(res, 0, digits, s);
return res;
}
};
C++代码实现:方法二
法二运行过程中占用内存更小。
class Solution {
private:
vector<string> nums;
public:
void get_sub(vector<string>& res, int i, string& digits, string s) {
if (i == digits.size()) {
res.push_back(s);
return;
}
string& tmp = nums[digits[i]-'0'];
for(int j = 0;j < tmp.size();j++) {
get_sub(res, i+1, digits, s+tmp[j]);
}
}
vector<string> letterCombinations(string digits) {
vector<string> res;
nums = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
string s = "";
if (digits.size() == 0) return res;
get_sub(res, 0, digits, s);
return res;
}
};