电话号码的字母组合
- 题解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的idxvoid 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+1backtrace(digits, i+1, cur);cur.pop_back();}}vector<string> letterCombinations(string digits) {if(! digits.size()) return res;backtrace(digits, 0, "");return res;}
};