Offer_93

有效 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 ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/restore-ip-addresses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
    private List<String> ret;
    private  StringBuilder sb;
    public List<String> restoreIpAddresses(String s) {
        ret =  new ArrayList<>();
        sb = new StringBuilder();
        if (s.length() > 12) {
            return ret;
        }
        dfs(0, s);
        return ret;
    }
    private void dfs(int n, String s) {
        // 对结果的剪枝
        if (n == 4 || s.length() == 0) {
            // 对结果的保存
            if (n == 4 && s.length() == 0) {
                ret.add(sb.toString());
            }
            return ;
        }
        // 注意的有i的长度不能大于2
        for (int i = 0; i < s.length() && i <= 2; i++) {
            // 对于第一个截取的字符串,首位不能为0, 如果为0, 则直接中断循环
            // 进行下一次遍历查找,这是可行性剪枝
            if (i != 0 && s.charAt(0) == '0') {
                break;
            }
            //  截取字符串, 待加入字符串
            String part = s.substring(0, i + 1);
            // 对于待加入的字符串进行可行性判断
            if (Integer.valueOf(part) <= 255) {
                // 对待输出的结果进行处理,加'.'
                if (sb.length() != 0) {
                    part = '.' + part;
                }
                // 加入
                sb.append(part);
                // 探索
                dfs(n + 1, s.substring(i + 1));
                // 回溯
                sb.delete(sb.length() - part.length(), sb.length());
            }
        }
    }
}

 

posted @ 2022-03-24 17:18  牵魂  阅读(37)  评论(0)    收藏  举报