答案是借鉴了,评论区大佬的思想,我感觉很好理解,然后自己写一个做个备份,给自己以后看。
思路见下图:
代码如下图,同时附上自己的注释:
class Solution { public: bool isjude(string s){//用于判断剩下的s字符串是否满足ip的基本定义 int nm = atoi(s.c_str()); if(s.size()> 1)//当大于1位的时候,则需要判断它首位不为0,同时在(0,255]的范围内 return s[0] != '0' && nm > 0 && nm <= 255; return nm >= 0 && nm <= 9;//当只有1位时,只需判断是否在【0,9】的范围即可 } void dfs(string s, string t, vector<string>&ans, int cnt){ if(cnt == 3 && isjude(s)){//前面以及划分好了3段,再将最后一段连接上就行,同时进行定义判定 ans.emplace_back(t + s); return; } for(int i = 1; i <= 3 && i < s.size(); ++i){//i为划分出来的为位数,最高不超过3,同时判断i的位数不能超过剩下字符串长度 string ss = s.substr(0, i);//为了截取长度为i的子串 //对截取的字串进行IP定义判断,若符合条件则进行递归 if(isjude(ss))dfs(s.substr(i), t + ss + '.', ans,cnt + 1); } } vector<string> restoreIpAddresses(string s) { vector<string>ans; string t; dfs(s, t, ans, 0); return ans; } };