7.24 combo & letterComboPhoneNum

to do

8.5.2] Combinations ite

昨天学的dfs+backtracking还是有用哒

    void combineR(int start, int n, int k, vector<int>& path, vector<vector<int>>& ret) {
        if (path.size()==k) {
            ret.push_back(path);
            return;
        }    
        for (int i=start; i<=n; ++i) {
            path.push_back(i);
            combineR(i+1, n, k, path, ret);
            path.pop_back();
        }
    }
   
    vector<vector<int>> combine(int n, int k) {
        if (k>n) return vector<vector<int>> {};
        vector<int> path; 
        vector<vector<int>> ret;
        combineR(1, n, k, path, ret);
        return ret;
    }

8.5.2] rec w/ math equ

C(n,k)=C(n-1,k-1)+C(n-1,k)
60%. Note that I initially did if (k==0||k>n) return vec<vec<int>>{};This will cause missing elems.

    vector<vector<int>> combine(int n, int k) {
        if (k>n) return vector<vector<int>>{};
        vector<int> vec;
        if (k==n || k==0) {
            for (int i=1; i<=k; ++i) vec.push_back(i);
            return vector<vector<int>> {vec};
        }
        
        auto ret1 = combine(n-1, k-1);
        for_each(ret1.begin(), ret1.end(), [n](vector<int>& v){
            v.push_back(n);}); // need to capture n
        auto ret2 = combine(n-1, k);
        ret1.insert(ret1.begin(), ret2.begin(), ret2.end());
        return ret1;
    }

8.6.1] rec Letter Combinations of a Phone Number

note using vector<string> keypads {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};

    void letterR(vector<string>& keypads, string digits, string& path, vector<string>& ret) {
        if (path.size()==digits.size()) {
            ret.push_back(path);
            return;
        }
        string letters = keypads[digits[path.size()]-'0'];
        for (int i=0; i<letters.size(); ++i) {
            path.push_back(letters[i]);
            letterR(keypads, digits, path, ret);
            path.pop_back();
        }
    }
    
    vector<string> letterCombinations(string digits) {
        vector<string> ret;
        if (digits=="") return ret;
        vector<string> keypads {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
        string path; 
        letterR(keypads, digits, path, ret);
        return ret;
    }

8.6.2] ite Letter Combinations of a Phone Number

写一写找规律,然而看了答案;(

    vector<string> letterCombinations(string digits) {
        if (digits.empty()) return vector<string>{};
        const vector<string> keypads {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
        vector<string> ret {""};
        
        for (int i=0; i<digits.size(); ++i) {
            string keypad = keypads[digits[i]-'0'];
            vector<string> ret_base = std::move(ret);
            ret.clear();
            for (int j=0; j<keypad.size(); ++j) {
                vector<string> toInsert = ret_base;
                char c = keypad[j];
                for (string& str : toInsert) {
                    str.push_back(c);
                }
                ret.insert(ret.end(), toInsert.begin(), toInsert.end());
                
            }
        }
        return ret;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,790评论 0 33
  • 文/杨秋心 图/网络 “这柄刀,三尺一寸,我用它杀过很多人。若伤人取命,它天下第一,论刻骨揉心,没有你锋利。” 虽...
    杨秋心阅读 531评论 2 1
  • 今天同学去医务室,都是看鼻炎的人~空气质量真是令人堪忧!! 同学问我为什么现在不开始模考?因为自己现在强化刚刚开...
    忽尔今至阅读 195评论 0 0
  • 我的理性上的逻辑是,如果能和好,为什么要分开呢?如果能复合那一定是因为条件变了,就是当初分开所基于的原因变了。这样...
    SuperNinja阅读 256评论 0 0
  • (野蛮生长第26篇,字数1029) 当钥匙往右旋转一下,小小的、极细的插入声音跃进我的耳朵。这一刻,短暂的愉悦感随...
    莫逆莫逆阅读 477评论 1 1