力扣-93题 复原IP地址(C++)- 回溯切割

题目链接:https://leetcode-cn.com/problems/restore-ip-addresses/
题目如下:
在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    vector<string> restoreIpAddresses(string s) {
        if(s.size()>12) return result;//特判
        backtracking(s,0,0);
        return result;
    }
    //startIndex必须有,因为不能重复分割,记录下一层递归分割的起始位置
    //pointNum,用于记录添加逗点的数量
    //注:题目要求,分为四段,则以传统的以字符长度作为跳出递归的条件不符合题意,应该以分的段数作为条件判断是否退出递归
    void backtracking(string s,int startIndex,int pointNum){
        if(pointNum==3){
            if(isVaild(s,startIndex,s.size()-1)){//判断第四段子字符串是否合法,若合法则放入
                result.push_back(s);
            }
            return ;
        }

        for(int i=startIndex;i<s.size();i++){
            if(isVaild(s,startIndex,i)){//判断区间内的子串是否合法
                s.insert(s.begin()+i+1,'.');//在i的后面加入一个逗点
                pointNum++;
                backtracking(s,i+2,pointNum);
                pointNum--;
                s.erase(s.begin()+i+1);
            }else break;//不合法,则直接结束本层循环
        }
    }
    //判断是否为一个有效段位
    bool isVaild(string s,int l,int r){
        if(l>r){
            return false;
        }

        if(s[l]=='0'&&l!=r){//不能以0为开头的数字
            return false;
        }

        int num=0;
        for(int i=l;i<=r;i++){
            if(!isdigit(s[i])){//如果不是数字字符
                return false;
            }

            num=num*10+s[i]-'0';
            if(num>255){//不能大于255
                return false;
            }
        }
        return true;
    }
private:
    vector<string> result;
    string path;
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值