93 restore ip address

https://leetcode.com/problems/restore-ip-addresses/submissions/

不难 但是edge cases很多,注意最后一个位置是没有点的,所以最后一个segment要特殊检查

注意一下这个用int[]+idx来记录track的方法,比用list要方便的

class Solution {
    List<String> ans = new ArrayList<>();
    public List<String> restoreIpAddresses(String s) {
        int[] loc = new int[3];
        dfs(loc, s.toCharArray(), 0, 0, s.length());
        return ans;
    }
    private void dfs(int[] loc, char[] array, int index, int start, int end) {
        if (index == loc.length) {
            int cnt = 0;
            //检查一下最后一段
            if (start < end){
                //防止最后一段开头为0
                if (start + 1 < end && array[start] == '0') return;
                for (int i = start; i < end; i++) {
                    cnt = cnt * 10 + (array[i] - '0');
                    //防止最后overflow了
                    if (cnt >= 256) return;
                }
                if (cnt < 256) ans.add(getIp(loc, array));
            }
            return;
        }
        if (start >= end) return;
        if (array[start] == '0') {
            loc[index] = start;
            dfs(loc, array, index + 1, start + 1, end);
        } else {
            int cnt = 0;
            int i = start;
            while (i < end && cnt < 256) {
                cnt = cnt * 10 + (array[i] - '0');
                // System.out.println(start + " " + cnt);
                loc[index] = i++;
                if (cnt < 256) dfs(loc, array, index + 1, i, end);
            }
        }
    }
    private String getIp(int[] loc, char[] array) {
        char[] ans = new char[array.length + 3];
        int j = 0;
        int idx = 0;
        for (int i = 0; i < array.length; i++) {
            ans[j++] = array[i];
            //防止idx越界
            if (idx < 3 && i == loc[idx]) {
                idx++;
                ans[j++] = '.';
            }
        }
        return new String(ans);
    }
}

可以在最后插一个点来统一一下逻辑,如果最后一个点没插在最后就不要了,这样简单一点,对每个segment规则是如果开头是0那么只能立马进下一层dfs, 否则进dfs到num>255为止

class Solution {
    List<String> ans = new ArrayList<>();
    public List<String> restoreIpAddresses(String s) {
        dfs(s, new int[4], 0, s.length(), 0);
        return ans;
    }
    private void dfs(String s, int[] dots, int start, int end, int idx) {
        if (idx == 4) {
        //最后一个点要插在最后
            if (dots[3] != end-1) {
                return;
            }
            String str = build(s, dots);
            if (str == "") {
                return;
            }
            ans.add(str);
            return;
        }
        if (start >= end) {
            return;
        }
        int num = 0;
        for (int i = start; i < end; i++) {
            if (i == start && s.charAt(i) == '0') {
                dots[idx] = i;
                dfs(s, dots, start+1, end, idx+1);
                break;
            } else {
                num = num*10 + (s.charAt(i)-'0');
                if (num > 255) {
                    break;
                }
                dots[idx] = i;
                dfs(s, dots, i+1, end, idx+1);
            }
        }
    }
    private String build(String s, int[] dots) {
        char[] arr = new char[s.length() + 3];
        char[] str = s.toCharArray();
        int idx = 0;
        int ptr = 0;
        for (int i = 0; i < str.length; i++) {
            arr[ptr++] = str[i];
            // 插入到第三个点就好了
            if (idx < 3 && i == dots[idx]) {
                arr[ptr++] = '.';
                idx++;
            }
        }
        return new String(arr);
    }
}

Last updated