【LeetCode-93】复原 IP 地址

问题

给定一个只包含数字的字符串,用以表示一个 IP 地址,返回所有可能从 s 获得的 有效 IP 地址 。你可以按任何顺序返回答案。

有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。

例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。

示例

输入: s = "010010"
输出: ["0.10.0.10","0.100.1.0"]

解答

class Solution {
public:
    vector<string> restoreIpAddresses(string s) {
        ans.resize(4);
        dfs(s, 0, 0);
        return res;
    }
private:
    vector<string> res;
    vector<int> ans;
    void dfs(string& s, int pos, int id) { // 最多4层递归
        if (id == 4) {
            if (pos == s.size()) {
                string p;
                for (auto& i : ans) p += to_string(i) + ".";
                p.pop_back();
                res.emplace_back(p);
            }
            return;
        }
        if (s[pos] == '0') { // 前导0
            ans[id] = 0;
            dfs(s, pos + 1, id + 1);
            return;
        }
        int cur = 0;
        for (int i = pos; i < s.size(); i++) {
            cur = 10 * cur + s[i] - '0';
            if (cur > 255) return;
            ans[id] = cur;
            dfs(s, i + 1, id + 1);
        }
    }
};

重点思路

换了一种dfs写法,因为递归层数是固定的,所以可以不采用push_back和pop_back这样的方式,直接按index赋值即可。本题需要注意前导0的处理,首项为0时,这个id必定为0。

posted @ 2021-09-09 00:10  tmpUser  阅读(52)  评论(0编辑  收藏  举报