力扣算法题—093复原IP地址

给定一个只包含数字的字符串,复原它并返回所有可能的 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 };

猜你喜欢

转载自www.cnblogs.com/zzw1024/p/10787627.html