字符串93. 复原IP地址

Posted ocpc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串93. 复原IP地址相关的知识,希望对你有一定的参考价值。

题目:

技术图片

 

 

解答:

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地址的主要内容,如果未能解决你的问题,请参考以下文章

字符串93. 复原IP地址

精选力扣500题 第59题 LeetCode 93. 复原 IP 地址c++/java详细题解

Leetcode No.93 复原 IP 地址(DFS)

Leetcode No.93 复原 IP 地址(DFS)

leetcode中等93复原IP地址

leetcode 每日一题 93. 复原IP地址