zoukankan      html  css  js  c++  java
  • 17.Letter Combinations of a Phone Number(Back-Track)

    Given a digit string, return all possible letter combinations that the number could represent.

    A mapping of digit to letters (just like on the telephone buttons) is given below.

    Input:Digit string "23"
    Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

    思路I:iteration,广度优先。三重for循环,分别循环数字字符串、每个数字对应的字母、已有的result。时间复杂度O(n*3*(3^n))
    class Solution {
    public:
        vector<string> letterCombinations(string digits) {
            if(digits=="") return result;
            
            m.clear();
            m.insert(make_pair('2',"abc"));
            m.insert(make_pair('3',"def"));
            m.insert(make_pair('4',"ghi"));
            m.insert(make_pair('5',"jkl"));
            m.insert(make_pair('6',"mno"));
            m.insert(make_pair('7',"pqrs"));
            m.insert(make_pair('8',"tuv"));
            m.insert(make_pair('9',"wxyz"));
            
            result.push_back("");
            int resultSize;
            for(int i = 0; i < digits.length(); i++){//traverse digits
                resultSize = result.size();
                cout << "size= " << resultSize << endl;
                for(int j = 1; j < m[digits[i]].length(); j++){ //traverse the character in the digit(except first)
                    for(int k = 0; k < resultSize; k++){ //traverse all current result
                        result.push_back(result[k] + m[digits[i]][j]);
                    }
                }
                for(int k = 0; k < resultSize; k++){ //deal with first digit: directly add in the current result
                    result[k] += m[digits[i]][0];
                }
            }
            
            return result;
        }
    private:
        unordered_map<char, string> m;
        vector<string> result;
        
    };

    思路II: recursion,深度优先。将最外层循环转换成递归,递归的depth表示是第几个数字。每次遍历要加上当前数字对应的字母(for循环),加好后递归调用。

    class Solution {
    public:
        vector<string> letterCombinations(string digits) {
            m.clear();
            m.insert(make_pair('2',"abc"));
            m.insert(make_pair('3',"def"));
            m.insert(make_pair('4',"ghi"));
            m.insert(make_pair('5',"jkl"));
            m.insert(make_pair('6',"mno"));
            m.insert(make_pair('7',"pqrs"));
            m.insert(make_pair('8',"tuv"));
            m.insert(make_pair('9',"wxyz"));
            
            int len = digits.length();
            dfs("", digits,0);
            return result;
        }
        void dfs(string s, string& digits, int depth){
            char c = digits[depth];
            
            for(int i = 0; i < m[c].length(); i++){
                if(depth==digits.length()-1) {
                    result.push_back(s+m[c][i]);
                }
                else dfs(s+m[c][i], digits, depth+1);
            }
        }
    private:
        unordered_map<char, string> m; //map是用红黑树实现查找,O(logn); unordered_map是用Hash table实现查找,O(1)
        vector<string> result;
    };
  • 相关阅读:
    vue中使用v-on绑定事件中,获取$event.currentTarget,日志打印为null
    问题记录:events.js:183 throw er; // Unhandled 'error' event Error: listen EADDRINUSE 127.0.0.1:8888
    跨域通信——多窗口通信
    fiddler抓包工具-常用功能1
    git使用手册
    webpack.config.js配置文件
    Loader转换器
    webpack安装使用
    <el-table>里的数据已经修改了,但是页面不更新
    <el-onload>使用属性file-list时返回数据里必须含url字段
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/4676658.html
Copyright © 2011-2022 走看看