组合问题(多集合)
17. 电话号码的字母组合 - 力扣(LeetCode)
class Solution {
private:string lettermap[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
public:string s;vector<string>result;void backtrucking(string &digits,int index){if(index==digits.size()){result.push_back(s);return;}int digit=digits[index]-'0';string letters=lettermap[digit];for(int i=0;i<letters.size();i++){s.push_back(letters[i]);backtrucking(digits,index+1);s.pop_back();}}vector<string> letterCombinations(string digits) {if(digits.size()==0){return result;}backtrucking(digits,0);return result;}
};
按照digit的值,依次取字符串中的元素,理解成类似二叉树一样的结构,定义index来统计取到了digit中的第几个。
定义s字符串存储搜索路径中的值,定义数组result来统计所有路径字符串的情况
终止条件:当index的值与字符串digits的大小相等时,也就时搜索路径到底了,到达叶子节点的情况,这时将s存储路径的值push进入到result结果数组中,最后return回上一层递归。
单层递归逻辑:循环遍历每一个集合中所有的值,将取到的值加入到s字符串中,再递归循环digit字符串中下一个数,最后将加入的值pop出去,这样才能在下次循环中加入新的值,每一次循环完成后就形成一个完整的结果。