电话号码的字母组合
- 题解1 回溯
- 比较直观的理解
给定一个仅包含数字
2-9
的字符串,返回所有它能表示的字母组合。答案可以按
任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = "23"
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
示例 2:
输入:digits = ""
输出:[]
示例 3:
输入:digits = "2"
输出:[“a”,“b”,“c”]
提示:
- 0 <=
digits.length
<= 4 digits[i]
是范围['2', '9']
的一个数字。
题解1 回溯
class Solution {
map<int, string> sysmap = {
{1, ""},
{2, "abc"},
{3, "def"},
{4, "ghi"},
{5, "jkl"},
{6, "mno"},
{7, "pqrs"},
{8, "tuv"},
{9, "wxyz"}};
vector<string> res;
string cur = "";
public:
// idx 是 digits的idx
void backtrace(string& digits, int idx){
// 从题意可知,这个排列组合是
// 1. 方向:从左到右
// 2. 组合方式:各个数字对应的字符串取1个
// 所以退出递归的条件就是idx==digits.size()
if(idx == digits.size()){
res.push_back(cur);
return;
}
for(auto& c : sysmap[digits[idx]-'0']){
cur.push_back(c);
backtrace(digits, idx+1);
cur.pop_back();
}
}
vector<string> letterCombinations(string digits) {
if(! digits.size()) return res;
backtrace(digits, 0);
return res;
}
};
比较直观的理解
class Solution {
map<int, string> sysmap = {
{1, ""},
{2, "abc"},
{3, "def"},
{4, "ghi"},
{5, "jkl"},
{6, "mno"},
{7, "pqrs"},
{8, "tuv"},
{9, "wxyz"}};
vector<string> res;
//string cur = "";
public:
void backtrace(string& digits, int idx, string cur){
if(cur.size() == digits.size()){
res.push_back(cur);
return;
}
for(int i = idx; i < digits.size(); i++)
for(auto& c : sysmap[digits[i]-'0']){
cur.push_back(c);
// 这里注意是i+1 不是idx+1
backtrace(digits, i+1, cur);
cur.pop_back();
}
}
vector<string> letterCombinations(string digits) {
if(! digits.size()) return res;
backtrace(digits, 0, "");
return res;
}
};