标签: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 }
标签:int 个数 height rest vat nbsp const sse ipa
原文地址:https://www.cnblogs.com/ocpc/p/12825975.html