93. Restore IP Addresses

来源:互联网 发布:cf刷等级软件 编辑:程序博客网 时间:2024/06/05 14:28

Given a string containing only digits, restore it by returning all possible valid IP address combinations.

For example:
Given “25525511135”,

return [“255.255.11.135”, “255.255.111.35”]. (Order does not matter)

思路1:回溯法

bool validSub(string& sub){    //注意在此判断若首字母为0,则一定是“0”才合法    if (sub[0] == '0') return sub == "0";    int res = stoi(sub);  //字符串转int      return res <= 255 && res > 0;}void helper(string s, int count, string sub, vector<string>&result){    if (count == 3 && validSub(s)){        result.push_back(sub + s);        return;    }    for (int i = 1; i <= 3 && i < s.size(); i++){        string strstr = s.substr(0, i);        if (validSub(strstr)){            helper(s.substr(i), count + 1, sub + strstr + ".", result);        }    }}vector<string> restoreIpAddresses(string s) {    vector<string> result;    if (s.empty() || s.size()<4 || s.size()>12) return result;    helper(s, 0, "", result);    return result;}

思路2:直接循环判断

bool validSub(string& sub){    //注意在此判断若首字母为0,则一定是“0”才合法    if (sub[0] == '0') return sub == "0";    int res = stoi(sub);  //字符串转int      return res <= 255 && res > 0;}vector<string> restoreIpAddresses1(string s) {    vector<string> result;    if (s.empty() || s.size()<4 || s.size()>12) return result;    for (int i = 0; i < s.size(); i++){        for (int j = i + 1; j < s.size(); j++){            for (int k = j + 1; k < s.size(); k++){                string ip1 = s.substr(0, i + 1);                string ip2 = s.substr(i + 1, j - i);                string ip3 = s.substr(j + 1, k - j);                string ip4 = s.substr(k + 1);                if (validSub(ip1) && validSub(ip2) && validSub(ip3) && validSub(ip4)){                    string ip = ip1 + "." + ip2 + "." + ip3 + "." + ip4;                    result.push_back(ip);                }            }        }    }    return result;}

思路3:优化的循环判断

vector<string> restoreIpAddresses(string s) {    vector<string> res;    if (s.empty() || s.size()<4 || s.size()>12) return res;    vector<string> res;    string tmp;    for (int i = 1; i < 4; i++){        for (int j = 1; j < 4; j++){            for (int k = 1; k < 4; k++){                for (int l = 1; l < 4; l++){                    if (i + j + k + l == s.size()){                        int A = stoi(s.substr(0, i));                        int B = stoi(s.substr(i, j));                        int C = stoi(s.substr(i + j, k));                        int D = stoi(s.substr(i + j + k, l));                        if (A < 256 && B < 256 && C < 256 && D < 256)                        if ((tmp = to_string(A) + "." + to_string(B) + "." + to_string(C) + "." + to_string(D)).size() == s.size() + 3)                            res.push_back(tmp);                    }                }            }        }    }    return res;}
原创粉丝点击