8.7 dfs: restoreIP && combSumI&&II

to do

10.6] Restore IP Addresses

note 0.xx.0.xx is ok while 0x.xx.. is not)
// wrong move: placed starti+len+1

    int MAXCT = 4;
    void dfs(vector<string>& ret, string path, int segCt, const string& s, int starti) {
        if (segCt == MAXCT) {
            if (path.size() == s.size()+ MAXCT) {
                path.pop_back();
                ret.push_back(path);
            } 
            return;
        }
        // trim
        int remainingCt = s.size()-starti;
        if (remainingCt < (MAXCT-segCt) || remainingCt > (MAXCT-segCt)*3) return;
        
        // string [starti, starti+len)
        for (int len=1; len<=3 && starti+len<=s.size(); ++len) {
            string seg = s.substr(starti, len);
            if (stoi(seg)>255 || (seg[0]=='0' && seg.size()>1)) break;
            dfs(ret, path + seg + ".", segCt+1, s, starti+len); // wrong move: placed `starti+len+1`
        }
    }
    //  four decimal numbers, each ranging from 0 to 255 (note 0.xx.0.xx is ok while 0x.xx.. is not)
    vector<string> restoreIpAddresses(string s) {
        vector<string> ret;
        string path;
        dfs(ret, path, 0, s, 0);
        return ret;
    }

10.7] Combination Sum

note to keep non-desc order

    void dfs(vector<vector<int>>& ret, vector<int>& path, int starti, vector<int>& candidates, int target) {
        if (!target) {
            ret.push_back(path);
            return;
        }
        for (int i=starti; i<candidates.size(); ++i) {
            if (target-candidates[i]<0) break;
            path.push_back(candidates[i]);
            dfs(ret, path, i, candidates, target-candidates[i]);
            path.pop_back();
        }
    }
    
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        sort(candidates.begin(), candidates.end());
        vector<vector<int>> ret;
        vector<int> path;
        dfs(ret, path, 0, candidates, target);
        return ret;
    }

10.8] Combination Sum II

note how to avoid duplicate

    void dfs(vector<vector<int>>& ret, vector<int>& path, int starti, vector<int>& candidates, int target) {
        if (!target) {
            ret.push_back(path);
            return;
        }    
        for (int i=starti; i<candidates.size(); ++i) {
            if (i>starti && candidates[i]==candidates[i-1]) continue;
            if (target-candidates[i]<0) break;
            path.push_back(candidates[i]);
            dfs(ret, path, i+1, candidates, target-candidates[i]);
            path.pop_back();
        }
    }
    
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        sort(candidates.begin(), candidates.end());
        vector<vector<int>> ret;
        vector<int> path;
        dfs(ret, path, 0, candidates, target);
        return ret;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,769评论 0 33
  • NAME dnsmasq - A lightweight DHCP and caching DNS server....
    ximitc阅读 2,929评论 0 0
  • 爱情最美好的结局,无非是,我好,你也好好的,即使我们不在一起了,时间也许弥补不了伤痕,但是,能冲淡一切记忆。
    罗俊美阅读 177评论 0 0
  • 雨, 缠缠绵绵, 温柔地把每一棵树、每一株草都洗刷干净。 这是春天的最后一场雨。 在这最后一场雨的最后一滴雨落下之...
    换日线ylp阅读 309评论 0 0
  • Block Pointer是这样定义的: 回传值(^名字)(参数列); 例:typedefvoid(^change...
    木木_mislay阅读 208评论 0 1