答案是借鉴了,评论区大佬的思想,我感觉很好理解,然后自己写一个做个备份,给自己以后看。
思路见下图:

图片说明

代码如下图,同时附上自己的注释:

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;
    }
};