leecode-93.复原IP地址

题目

复原IP地址

思路分析

本题就是在一串字符串里面找到三个可以插入’.'的位置,保证分割之后的子字符串满足IP编码的方式。因此我们采用递归的方式进行探索。

  • 每次DFS的过程中有三个变量,分别存储当前使用的’.‘的次数,最新插入的’.'的位置,当前的字符串。
  • 每次从上次的位置开始探索,是否满足可以分割的条件。

代码

class Solution {
public:
    int n;//字符串的长度
    string str;//存储原字符串
    vector<string> ans;//存储结果
    //判断当前插入'.'之后的子字符串是否合理
    bool isValid(int st, int ed){
        int sum = 0;
        for(int i = st;i <= ed;i++){
            if(st != ed && str[st] == '0') return false;
            sum = sum * 10 + str[i] - '0';
            if(sum > 255) return false;
        }
        return true;
    }
    //递归入口
    void DFS(int pointNum, int pos, string &cur){
        if(pointNum == 3){
            if(isValid(pos + 1, n - 1)) ans.push_back(cur);
            return;
        }
        for(int i = pos + 1;i < n - 1;i++){
            if(isValid(pos + 1, i)){
                if((n - i ) > (4 - pointNum) * 3) continue;//插入字符串之后,如果剩余的长度大于最长的长度,继续。
                cur.insert(cur.begin() + i + 1 + pointNum, '.');//插入字符串
                DFS(pointNum + 1, i, cur);//下一层
                cur.erase(i + 1 + pointNum, 1);//返回
            }
        }
    }
    vector<string> restoreIpAddresses(string s) {
        n = s.size(), str = s;
        DFS(0, -1, s);
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值