leetcode93复原ip地址

在这里插入图片描述
在这里插入图片描述
思路:

  1. 回溯+剪枝
  2. 步骤,一般用vector比较多,两个起步,一个存临时值,一个存result,还有判断是否结束的begin和end
    (1) 确定可以进入result的数据
    (2) 进行剪枝操作
    (3) 回溯
//(1)
if(....)
{
	result.push_back();
	return;
}
//(2)
if(...)
	return;
if(...)
	return;
//(3)
for(j){
      temp.push_back(t);
      IpAdd(s,begin+j,end,temp,re);
      temp.pop_back();
}

代码

void IpAdd(string s,int begin,int end,vector<string> &temp,vector<string> &re){
	if(begin==end&&temp.size()==4){
        if(temp[0].size()<=3&&temp[1].size()<=3&&temp[2].size()<=3&&temp[3].size()<=3)//这句其实不用加,后面的回溯已经保证了所有的分段都是3以内,只是加上后leetcode跑的更快
            {
                string result = temp[0]+"."+temp[1]+"."+temp[2]+"."+temp[3];
                re.push_back(result);
                return;
            }
    }
    //剪枝
    if(begin==end&&(temp.size()>4||temp.size()<4))
        return;
    if(begin!=end&&(temp.size()>=4))
        return;

	//0开头的必须是单独的一位 xxx.0.xxx.0
    int j=1;
    if(s[begin]=='0'){
        temp.push_back("0");
        IpAdd(s,begin+1,end,temp,re);
        temp.pop_back();
    }
    else
    for(;j<=3;j++){
        if(begin+j<=end){
            string t = s.substr(begin,j);
            if(atoi(t.c_str())<=255){
                temp.push_back(t);
                IpAdd(s,begin+j,end,temp,re);
                temp.pop_back();
            }
        }
    }        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值