zoukankan      html  css  js  c++  java
  • Leetcode刷题记录--17. *的字母组合(回溯)

    这道题的解法类似于排列组合,将其视为树结构,并对其完成搜索。

    给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

    给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

    示例:

    输入:"23"
    输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

    通过观察,我们可以得知一下几点:

    • 每一层的节点:每一层的节点应该是digits字符串某一位的对应的数字,比如说“23”中的3,要得到这个数字大体有两种方式:
      一种是在每一次的函数调用中取字符串的第0位——s[0],调用下一层函数时再从原字符串中从第1位开始截取子串;s.substr(1)。
      一种是传递一个指针pos,指向当前所指的位置,每一层调用将指针向后移动

    • 每一层传递中记录一下当前已拼接的字符串str

    • 终止条件,这个递归的的终止条件可以有很多,这取决于你采用什么方式得到每一层的节点,可以判断截取后的子串长度是否为0,也可以判断pos的位置是否为digits的最后一位。

    • 映射可以用arr[index]即数组访问下标的方式实现,也可以用hashmap实现。
      代码如下:

    class Solution {
    private:
        string str="";
    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){
            
            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;
                str+= w;
                dfs(map, digits, result, pos+1);
                str.pop_back();
            }
            return;
            
        }
    };
    
  • 相关阅读:
    hdoj-1013-Digital Roots(九余数定理)
    hdu-1012-u Calculate e(水题)
    hdoj-1005-Number Sequence
    JavaScript--收藏栏添加按钮,放大hdu题目字体
    string和double之间的相互转换(C++)
    轻谈 return i++
    Java中equals和==之间的区别
    进程的内核栈、用户栈
    关于Linux中cd的一些快捷用法
    Mac 下如何使用sed -i命令
  • 原文地址:https://www.cnblogs.com/yuyuan-bb/p/12728931.html
Copyright © 2011-2022 走看看