题目描述:
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
思路:
采用回溯法,也就是DFS
代码示例:
class Solution {
public:
vector<string> letterCombinations(string digits) {
if(digits.empty())
return {}; //返回空数组
vector<vector<char>>d(10); //定义一个二维数组,大小为10*n
d[0]={' '}; //空字符串
d[1]={};
d[2]={'a','b','c'};
d[3]={'d','e','f'};
d[4]={'g','h','i'};
d[5] = {'j','k','l'};
d[6] = {'m','n','o'};
d[7] = {'p','q','r','s'};
d[8] = {'t','u','v'};
d[9] = {'w','x','y','z'};
string cur;
vector<string>ans;
dfs(digits,d,0,cur,ans);
return ans;
}
private:
void dfs(const string& digits,const vector<vector<char>>& d,int l,string& cur,vector<string>& ans){
if (l==digits.length()){
ans.push_back(cur);
return;
}
for (const char c:d[digits[l]-'0']){
cur.push_back(c);
dfs(digits,d,l+1,cur,ans);
cur.pop_back();
}
}
};
代码示例二:
class Solution {
public:
vector<string> letters(char num) {
vector<vector<string>> letter({ {"a","b","c"},{ "d","e","f" },{ "g","h","i" },
{ "j","k","l" },{ "m","n","o" },{ "p","q","r" ,"s" },
{ "t","u","v" },{ "w","x","y" ,"z"} });
vector<string> ans({ letter[num - '2'] });
return ans;
}
vector<string> combine(string & str) {
// if size =1, return the telephone letters
if (str.size() == 1)
return letters(str[0]);
// if size >=2, split it!
vector<string> ret;
string str1(str.substr(0, str.size() / 2));
string str2( str.substr(str.size() / 2 ) );
vector<string> s1 = combine(str1);
vector<string> s2 = combine(str2);
for (auto i : s1)
for (auto j : s2) {
ret.push_back(i + j);
}
return ret;
}
vector<string> letterCombinations(string& digits) {
vector<string> ret;
if (digits.size() == 0)
ret = {};
else
ret = combine(digits);
return ret;
}
};