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;

    } 

};

 

你可能感兴趣的:(LeetCode)