93. 复原 IP 地址

class Solution {
public:
    // 回溯函数,负责分割IP地址的四段
    void backtrack(const string &s, int start, int segId, vector<string> &segments, vector<string> &res) {
        // 如果已经分成4段
        if (segId == 4) {
            // 并且所有字符都用完,说明是一个有效IP
            if (start == s.size()) {
                res.push_back(segments[0] + '.' + segments[1] + '.' + segments[2] + '.' + segments[3]);
            }
            return; // 结束本次递归
        }
        // 每一段尝试1~3个字符
        for (int len = 1; len <= 3; ++len) {
            // 剩余字符不够了,直接跳出
            if (start + len > s.size()) break;
            // 取出当前尝试的这段字符串,从字符串 s 的 第 start 个位置开始,取连续的 len 个字符。
            string part = s.substr(start, len);
            // 剪枝1:不能有前导0(除了单独的"0")     
            if (part.size() > 1 && part[0] == '0') continue;
            // 剪枝2:不能超过255
            if (stoi(part) > 255) continue;
            // 保存当前段到segments
            segments[segId] = part;
            // 递归处理下一段
            backtrack(s, start + len, segId + 1, segments, res);
        }
    }

    vector<string> restoreIpAddresses(string s) {
        vector<string> res;           // 存储最终结果
        vector<string> segments(4);   // 临时存放每一段IP的字符串
        backtrack(s, 0, 0, segments, res); // 从第0个字符、第0段开始递归
        return res; // 返回结果
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值