zoukankan      html  css  js  c++  java
  • LeetCode Restore IP Addresses

    class Solution {
    public:
        vector<string> restoreIpAddresses(string s) {
            vector<string> ips;
            vector<int> ip;
            dfs(s, 0, ip, ips);
            return ips;
        }
        
        void dfs(string& s, int pos, vector<int>& ip, vector<string>& ips) {
            int len = s.length();
            int fid = ip.size();
            if (len == pos) {
                if (fid == 4) {
                    ips.push_back(intip2str(ip));
                }
                return;
            }
            
            if (3 * (4 - fid) < len - pos) return;  // avoid TL
            
            int cur = 0;
            for (int i=pos; i<len && i < pos+3; i++) {
                if (i != pos && cur == 0) break;   // no leading zero in ip addr
                cur = cur * 10 + s[i] - '0';
                if (cur > 255) break;
                ip.push_back(cur);
                dfs(s, i + 1, ip, ips);
                ip.pop_back();
            }
        }
        
        string intip2str(vector<int> &ip) {
            if (ip.size() != 4 ) {
                return "format error. number of fields should be 4";
            }
            string strip;
            for (int i=0; i<4; i++) {
                strip.append(to_string(ip[i]));
                strip.append(i==3 ? "" : ".");
            }
            return strip;
        } 
    };

    反正ip地址数字不过直接dfs,不过也要稍微剪枝一下,前导零不能使用

    再写了一次,吐血了一个bug

    class Solution {
    private:
        vector<string> ips;
    public:
        vector<string> restoreIpAddresses(string s) {
            vector<int> ip;
            dfs(s, 0, 0, ip);
            return ips;
        }
        
        void dfs(string& s, int pos, int part, vector<int>& ip) {
            int len = s.size();
            if (part == 4) {
                if (pos == len) {
                    ips.push_back(int2ip(ip));
                }
                return;
            }
            int end = min(pos + 3, len);
            int v = 0;
    
            for (int i=pos; i<end; i++) {
                if (v == 0 && i - pos > 0) {
                    break;
                }
                
                v = v * 10 + s[i] - '0';
                
                if (v <= 255 && (len - i) >= (3 - part)) {
                    ip.push_back(v);
                    dfs(s, i + 1, part + 1, ip);
                    ip.pop_back();
                }
            }
        }
        
        string int2ip(vector<int>& ip) {
            char buf[16];
            sprintf(buf, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
            return buf;
        } 
    };
  • 相关阅读:
    一文快速入门分库分表(必修课)
    MySql分库分表与分区的区别和思考
    常用分库分表方案汇总
    分区分表分库
    MySQL分区和分表
    MySQL的聚集索引和非聚集索引
    PHP大文件上传支持断点上传组件
    PHP大文件上传支持断点上传工具
    Nginx大文件上传支持断点上传
    百度WebUploader大文件上传支持断点上传
  • 原文地址:https://www.cnblogs.com/lailailai/p/3825396.html
Copyright © 2011-2022 走看看