力扣 题目93- 复原 IP 地址

题目

题解

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

我们先简化一下该题

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

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

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

我们一个一个对比来看

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

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

2.每个整数位于 0255 之间组成

 即需要提取计算一下如果超过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  无聊的阿库娅  阅读(72)  评论(0)    收藏  举报