这道题的解法类似于排列组合,将其视为树结构,并对其完成搜索。
给定一个仅包含数字?2-9?的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
通过观察,我们可以得知一下几点:
每一层的节点:每一层的节点应该是digits字符串某一位的对应的数字,比如说“23”中的3,要得到这个数字大体有两种方式:
一种是在每一次的函数调用中取字符串的第0位——s[0],调用下一层函数时再从原字符串中从第1位开始截取子串;s.substr(1)。
一种是传递一个指针pos,指向当前所指的位置,每一层调用将指针向后移动
每一层传递中记录一下当前已拼接的字符串str
终止条件,这个递归的的终止条件可以有很多,这取决于你采用什么方式得到每一层的节点,可以判断截取后的子串长度是否为0,也可以判断pos的位置是否为digits的最后一位。
映射可以用arr[index]即数组访问下标的方式实现,也可以用hashmap实现。
代码如下:
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> result;
unordered_map<char,string> map;
map.insert({‘2‘,"abc"});
map.insert({‘3‘,"def"});
map.insert({‘4‘,"ghi"});
map.insert({‘5‘,"jkl"});
map.insert({‘6‘,"mno"});
map.insert({‘7‘,"pqrs"});
map.insert({‘8‘,"tuv"});
map.insert({‘9‘,"wxyz"});
if(digits == "") return result;
dfs(map, digits,result, 0, "");
return result;
}
//每个子value都不同
void dfs(unordered_map<char, string> map, string digits, vector<string> &result, int pos, string str){
if(pos == digits.size()){
result.push_back(str);
return;
}
string c = map[digits[pos]];
cout << "c=" << c << endl;
for(char w:c){
cout << str << endl;
dfs(map, digits, result, pos+1, str+w);
}
return;
}
};
Leetcode刷题记录--17. 电话号码的字母组合(回溯)
原文:https://www.cnblogs.com/yuyuan-bb/p/12728931.html