LeetCode-17-电话号码的字母组合
目录
LeetCode-17-电话号码的字母组合目录题目地址题目解析算法解析图形解释代码实现结果
题目地址
题目解析
-
题目给定一个包含数字的字符串
-
参考手机的数字输入键,2-9的数字都对应了几个英文字符
-
需要返回对应的字符串可以表示的字母组合
-
可以考虑使用dfs
算法解析
-
考虑使用直接暴力枚举法(dfs),得到一个数字字符,调用遍历其字母表,并在遍历过程中遍历另一个数字字符的字母表,从而完成组合的过程
-
使用map创建数字与字符串的映射关系(本题的映射比较简单,也可以通过数组来映射,这样是随机访问可能快一点)
-
设计一个函数用于dfs,接收字符串的索引参数,在内部递归
-
图形解释
-
以上是以digits == "23"绘制的遍历树,用循环实现同层遍历,用递归实现不同层遍历
-
时间复杂度与树叶的个数有关(digits的长度为n,每个数字对应的字符串长度为m[i],)
代码实现
class Solution {
private:
string self_digits; // 递归使用
vector<string> mapping_vec;
vector<string> result_vec;
string temp_result_str;
public:
Solution(){
this->mapping_vec = {" ","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
}
void combination(int index){
// 递归出口 digits遍历结束
if(index == this->self_digits.size()){
// 将组合结果添加到结果列表中,然后清除临时字符串末尾字符
this->result_vec.push_back(this->temp_result_str);
return;
}
// 获取当前考察的数字
int current_number = (int)this->self_digits[index] - '0';
for(int i = 0;i<this->mapping_vec[current_number].size();++i){
// 将映射表中考察到的字符加到临时字符串中
this->temp_result_str.push_back(this->mapping_vec[current_number][i]);
// 继续考察digits的下一位
this->combination(index+1);
this->temp_result_str.pop_back();
}
}
vector<string> letterCombinations(string digits) {
if(digits.empty()){
return this->result_vec;
}
this->self_digits = digits;
this->combination(0);
return this->result_vec;
}
};