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;
    };
  • 相关阅读:
    905. Sort Array By Parity
    arts-week9
    521. Longest Uncommon Subsequence I
    arts-week8
    学习linux/unix编程方法的建议,学习Linux的四个步骤(转)
    对Linux内核tty设备的一点理解(转)
    ARM微处理器中支持字节、半字、字三种数据类型,地址的低两位为0是啥意思?
    c语言中 char* 和 unsigned char* 的区别浅析(转)
    命名空间的定义与使用(转)
    每日一句古文(转)
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/4676658.html
Copyright © 2011-2022 走看看