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;
    };
  • 相关阅读:
    《JavaScript 闯关记》之 BOM
    《JavaScript 闯关记》之单体内置对象
    《JavaScript 闯关记》之基本包装类型
    《JavaScript 闯关记》之正则表达式
    《JavaScript 闯关记》之函数
    《JavaScript 闯关记》之数组
    被「李笑来老师」拉黑之「JavaScript微博自动转发的脚本」
    「前端开发者」如何把握住「微信小程序」这波红利?
    android开发之路13(实际开发常见问题及解决办法ING)
    android开发之路12(android四大组件&Fragment&AsyncTask类)
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/4676658.html
Copyright © 2011-2022 走看看