题解 | #数字字符串转化成IP地址#

数字字符串转化成IP地址

http://www.nowcoder.com/practice/ce73540d47374dbe85b3125f57727e1e

class Solution { public: /** * * @param s string字符串 * @return string字符串vector */ // vector restoreIpAddresses(string s) { // write code here //暴力搜索 // vector vs; // for (int i = 1; i <= 3; i++) { // for (int j = 1; j <= 3; j++) { // for (int m = 1; m <= 3; m++) { // for (int n = 1; n <= 3; n++) { // if (i + j + m + n == s.length()) { // string s1 = s.substr(0, i); // string s2 = s.substr(i, j); // string s3 = s.substr(i + j, m); // string s4 = s.substr(i + j + m, n); // if(judge(s1)&&judge(s2)&&judge(s3)&&judge(s4)) // { // string res=s1+"."+s2+"."+s3+"."+s4; // vs.push_back(res); // } // } // } // } // } // } // return vs; // }

bool judge(string s)
{
    if(stoi(s)<=255)
    {
        if(s[0]!='0'||(s.length()==1&&s[0]=='0'))
            return true;
    }
    return false;
}

//回溯加剪枝
vector<string> vs;
vector<string> restoreIpAddresses(string s){
    string res="";
    dfs(s, 0, res, 0);
    return vs;
}
void dfs(string s, int index, string& res, int step)
{
    //终止条件,当index到达最后一个字符时,可以将各个字符串拼接存入vs中
    //step是记录其中的分段点的个数
    if(step==4)
    {
        //判断索引是否到达s的最后一位,如果是,则进行存储,否则表明3个分段点并没有完全分完整个s
        if(index==s.length())
        {
            //删除最后一位多余的分段点
            res.erase(res.end()-1);
            vs.push_back(res);
        }
        else
        {
            return;
        }
    }
    //先取第一个ip段
    for(int i=1;i<=3&&index<s.length();i++)
    {
        //截取ip段
        string s1 = s.substr(index, i);
        //记录更新之前的res
        string temp = res;
        //判断字符串是否合规
        if(judge(s1))
        {
            //拼接(更新)res
            res = res+s1+".";
            //如果合乎规范,进行下一个字符串(位置是index+i)的递归
            dfs(s,index+i,res,step+1);
            //回溯(将res还原到更新之前的状态)
           res=temp;
        }
    }
}

};

全部评论

相关推荐

虚闻松声:继续投吧。 简历没啥问题。很优秀。 拙见:自我评价没什么意义;试试转向Agent开发、大模型应用;别死磕传统Java开发。 免费修改简历,就业咨询,欢迎私信交流。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务