力扣 题目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 }

浙公网安备 33010602011771号