码迷,mamicode.com
首页 > 其他好文 > 详细

【字符串】93. 复原IP地址

时间:2020-05-04 13:13:26      阅读:63      评论:0      收藏:0      [点我收藏+]

标签:int   个数   height   rest   vat   nbsp   const   sse   ipa   

题目:

技术图片

 

 

解答:

DFS深度搜索思路,数值>255非法,以零开头长度大于等于2非法;
不同于常规回溯思路,同层只用最多遍历3个数字,依次查看是否满足数值要求;
各段的数值状态也是分段存储的,互不干涉,使用vector<string> path来存储;

 1 private:
 2     vector<string> ans;//存放最终的结果
 3 //path存放此时从s[0,...,pos-1]找到的ip子串,size最大值为4    
 4 void findIpAddress(const string& s, int pos, vector<string>& path){
 5         int maxSize = (4-path.size())*3;//剩余位数的最大长度,最大为12
 6         //若剩余位数大于最大剩余位数长度,可提前终止
 7         if(s.size()-pos>maxSize) return;
 8         //ip字串的个数为4并且保证pos已经到s的末尾
 9         if(path.size()==4 && pos == s.size()){
10             //构造ip串
11             string str = path[0]+"."+path[1]+"."+path[2]+"."+path[3];
12             ans.push_back(str);//存放结果
13             return;
14         }
15         //递归回溯
16         //i<字符串s的长度,并且ip字串的长度不会超过3
17         for(int i=pos;i<s.size()&&i<=pos+2;++i){
18             string ip = s.substr(pos,i-pos+1);
19             if(isValid(ip)){
20                 path.push_back(ip);
21                 findIpAddress(s,i+1,path);
22                 path.pop_back();//手动对path进行回溯
23             }
24         }
25     }
26     bool isValid(string ip){
27         int val = stoi(ip);
28         if(val>255) 
29             return false;//ip子串最大值不能超过255
30         if(ip.size()>=2&&ip[0] == 0)
31             return false;//当ip子串长度大于2时,开头不能为0
32         return true;
33     }
34 public:
35     vector<string> restoreIpAddresses(string s) {
36         if(s.size()<4) return ans;
37         vector<string>path;
38         findIpAddress(s,0,path);
39         return ans;
40     }

 

【字符串】93. 复原IP地址

标签:int   个数   height   rest   vat   nbsp   const   sse   ipa   

原文地址:https://www.cnblogs.com/ocpc/p/12825975.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!