给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
示例:
输入: "25525511135" 输出:["255.255.11.135", "255.255.111.35"]
1 //暴力搜索 2 //一共分为4组 3 //每组数据不超过三位 4 class Solution { 5 public: 6 vector<string> restoreIpAddresses(string s) { 7 vector<string>res; 8 for(int a = 1; a<4;++a) 9 for(int b=1;b<4;++b) 10 for(int c =1;c<4;++c) 11 for(int d=1;d<4;++d) 12 if (a + b + c + d == s.size()) { 13 int A = stoi(s.substr(0, a));//取子串并转为数组 14 int B = stoi(s.substr(a, b)); 15 int C = stoi(s.substr(a+b, c)); 16 int D = stoi(s.substr(a+b+c, d)); 17 if (A <= 255 && B <= 255 && C <= 255 && D <= 255) { 18 string str = to_string(A) + "." + to_string(B) + "." + to_string(C) + "." + to_string(D); 19 if (str.size() == (s.size() + 3))//去除010这种组合 20 res.push_back(str); 21 } 22 } 23 return res; 24 25 } 26 }; 27 28 29 //使用递归 30 class Solution { 31 public: 32 vector<string> restoreIpAddresses(string s) { 33 vector<string>res; 34 helper(s, 0, "",res); 35 return res; 36 } 37 void helper(string s, int n, string out, vector<string>&res) { 38 if (n == 4) { 39 if (s.empty())res.push_back(out);//全部组合4组IP完毕 40 } 41 else { 42 for (int k = 1; k < 4; ++k) { 43 if (s.size() < k)break; 44 int val = stoi(s.substr(0, k));//取子串转化为数字 45 if (val > 255 || k != to_string(val).size())//当数字大于255或出现010,不满足 46 continue; 47 helper(s.substr(k), n + 1, out + s.substr(0, k) + (n == 3 ? "" : "."), res); 48 } 49 } 50 } 51 };