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

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

回溯

class Solution {
    /**
        回溯:结束条件(点的个数)、做选择(点的个数和字符串)、回溯/递归、移除选择
     */
    private List<String> res = new ArrayList<>();
    public List<String> restoreIpAddresses(String s) {
        if(s.length() > 12) {
            return res;
        }
        backTracking(s, 0 , 0);
        return res;
    }

    public void backTracking(String s, int startIndex, int pointNum) {
        //结束条件
        if(pointNum == 3) {
            if(isValid(s, startIndex, s.length() - 1)) {
                res.add(s);
            }
            return;
        }
        //循环
        for(int i = startIndex; i < s.length(); i++) {
            if(isValid(s, startIndex, i)) {
                //做选择
                pointNum++;
                s = s.substring(0, i + 1) + "." + s.substring(i + 1);
                //回溯/递归,注意起始位置是从下个数开始,隔过当前数和.符号
                backTracking(s, i + 2, pointNum);
                //移除选择
                pointNum--;
                s = s.substring(0, i + 1) + s.substring(i + 2);
            } else {
                break;
            }
        }
        
    }
    /**
        判断所包含的数字是否有效
     */
    public boolean isValid(String s, int start, int end) {
        if(start > end) {
            return false;
        }
        if(s.charAt(start) == '0' && start != end) {
            return false;
        }
        int num = 0;
        for(int i = start; i <= end; i++) {
            if(s.charAt(i) > '9' || s.charAt(i) < 0) {
                return false;
            }
            //注意:字符转数字,要-0的ASCII码
            num = num * 10 + (s.charAt(i) - '0');
            if(num > 255) {
                return false;
            }
        }
        return true;
    }
}

 

posted @ 2021-12-29 20:00  哥们要飞  阅读(23)  评论(0编辑  收藏  举报