力扣 题目93- 复原 IP 地址

题目

题解

这题一看用回溯算法比较省事 

我们先简化一下该题

简化后的题是 有三个点需要插入到s中 间隔为1或2或3 怎么插入(点不能在开头与结束)?

我们看简化的这个题 实际上很好写

那么复原 IP 地址就是在上面这个题上加了不少条件

我们一个一个对比来看

1.首先0不能做开头 只能自己被分 即间隔只能为1

   只能出现. 0. 不能出现.01.的情况

2.每个整数位于 0 到 255 之间组成

 即需要提取计算一下如果超过255 则间隔只能在1或2中取

3.最后一个整数 需要单独判断 因为当点被放完时(即点的个数为3)开始判断

 判断条件 1.判断最后一个是否长度是否为3以内(超过3就是百分百大于255) 即条件2

                 2.最后一个长度为3时是否大于255  即条件2

                 3.长度为3和2时 开头不能为0 即条件1

根据上面情况即可写出代码

代码

 1 #include<iostream>
 2 #include<vector>
 3 #include<string>
 4 using namespace std;
 5 int loop(string &s, vector<string> &reslut,int spot,int i) {
 6     int add = s[i] - 48;
 7     if (spot == 3) {
 8         //判断最后一个是否长度是否为3以内 这里可以和下面条件合并 但是太长分开了
 9         if (s.size() - i <4&& s.size()-i>0) {
10             //判断最后一个是否长度为3时是否大于255 或者开头是否为0而且长度不为1
11             if((s.size()-i==3&& (s[i] - 48)*100+ (s[i+1] - 48) * 10+ (s[i + 2] - 48)>255)||(s[i]=='0'&& s.size() - i != 1)) {
12                 return 0;
13             }
14             else
15             {
16                 reslut.push_back(s);
17             }
18         }
19     }
20     else
21     {
22         if (s[i] == '0') {
23             //只能切一次
24             s.insert(i+1,".");
25             loop(s, reslut, spot + 1, i + 2);
26             s.erase(i+1,1);
27         }
28         else
29         {
30             for (int j = 1; j < 4 && add < 256&&i+j<s.size(); j++) {
31                 add = add*10+ (s[i+1] - 48);
32                 s.insert(i + j, ".");
33                 loop(s, reslut, spot + 1, i + 1 + j);
34                 s.erase(i + j, 1);
35             }
36         }
37     }
38     return 0;
39 }
40 class Solution {
41 public:
42     vector<string> restoreIpAddresses(string s) {
43         if (s.size() < 4) {
44             return {};
45         }
46         vector<string> reslut;
47         loop(s, reslut,0,0);
48         return reslut;
49     }
50 };
51 
52 int main() {
53     Solution sol;
54     string s = "0690";
55     vector<string>result=sol.restoreIpAddresses(s);
56     for (int i = 0; i < result.size(); i++) {
57         cout << result[i] << endl;
58     }
59 }
View Code

 

 

 

 

posted @ 2022-07-17 18:52  无聊的阿库娅  阅读(108)  评论(0)    收藏  举报