-
易错点
- 截取表头子串cur时,下标不能越界!!! index<s.size()&&index<3;
- cur若含有前导0务必立马舍弃,不能用stoi及to_string()去除前导零.有前导零== size>1 && s[0]=='0';单独的"0"不算
- 用substr()截取子串时务必确认起始位置不越界,否则会抛出out_of_range
- 0号-2号的ip段(前三个段)需在有效数字串后面加点
- 用已经记录的ip段数n来确定出口,若n==4,检查剩下的输入串长度是否恰好为0,若是将收集串tmp压入输出串ans中
- 注意修改参数进行下一层递归时,尽量用临时值传参而不要修改全局量,否则递归结束需要恢复现场
-
#include <string> #include <vector> using namespace std; //s.substr(起始位置,长度),不加长度默认到末位; class Solution { public: bool valid(string &s) { //有前导0立刻丢弃-即字符个数大于1且首位为0;如果是"0"则不必 if(s.size()>1 && s[0]=='0') return false; int num = stoi(s); if(num > 255) return false; return true; } //输出串ans,剩余输入串,收集串,已转换的IP段数 //如果IP数段已经4个,检查剩下的输入串长度是否为0,若为tmp有效,压入ans中,返回 //同一层分别截取输入串的表头1-3位子串cur,若数值有效则dfs(ans,s-cur,tmp+cur,n+1) void DFS(vector<string> &ans,string s,string tmp,int n) { if(n==4) { if(s.empty()) ans.push_back(tmp); return; } if(s.empty()) return; string cur; //for(int i = 0; i < 3; ++i)务必检查是否越界 for(int i = 0;i<s.size() && i<3; ++i) { cur += s[i]; //先检查是否有前导0,有则跳过;否则检查数值有效性 if(valid(cur)) { string tmp1=tmp+cur; if(n<3) tmp1+='.';//0-2号段需要在后面加点 string sub=s.substr(i+1); DFS(ans,sub,tmp1,n+1); } } } vector<string> restoreIpAddresses(string s) { if(s.size()<4) return {}; vector<string> ans; DFS(ans,s,"",0); return ans; } };
leetcode 93.复原ip地址
于 2020-01-08 14:28:12 首次发布