1、问题描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
示例 1:
输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
示例 2:
输入:digits = “”
输出:[]
示例 3:
输入:digits = “2”
输出:[“a”,“b”,“c”]
2、算法思路与代码
这道题需要搜索所有组合,很明显可以使用回溯算法(或深度优先算法)来求解。在使用这个算法的时候,需要注意几个要点:
1、在什么情况下进入递归去搜索;
2、递归结束条件是什么;
3、使用什么数据结构来存储数据
4、套上深度优先算法基本模板即可
代码如下
class Solution {
public:
vector<string> letterCombinations(string digits) {
//使用STL中unordered_map来储存数据
unordered_map<char, string> phoneString{
{'2',"abc"},{'3', "def"},{'4',"ghi"},{'5',"jkl"},
{'6',"mno"},{'7',"pqrs"},{'8',"tuv"},{'9',"wxyz"}
};
string path;//使用字符串来储存子集
vector<string>ans;//存储结果
if(!digits.size()){
return ans;//如果digits为空,那么结果为空
}
dfs(digits, phoneString, path, ans, 0);//0表示从digits中提取其i个字母
return ans;
}
void dfs(string digits, unordered_map<char, string> phoneString, string& path, vector<string>& ans, int count) {//传引用
// 退出递归条件
if(count == digits.size()){
ans.push_back(path);
return;//找到完整子集
}
if(digits[count] < '1' || digits[count] > '9')
return;//其他按键无字母
char digit = digits[count];//提起数字
string letters = phoneString.at(digit);//数字所对应的字符串
for(auto letter : letters) {
path.push_back(letter);
dfs(digits, phoneString, path, ans, count + 1);//寻找count + 1位置的字母
path.pop_back();//回溯时,将刚刚加入的字母去除(比如2中的’a'),然后添加该位置下一个字母(‘b’)
}
}
};
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。