/* All Contributors (C) 2020 */ package io.github.wkk.everyday.aug; import java.util.ArrayList; import java.util.List; /** * 复原IP地址(IP格式: 每一位都在0-255之间) * *

思路: 1.暴力求解 2.回溯(涉及到求所有的结果, 常用方法) * * @author kongwiki@163.com * @since 2020/8/9上午9:33 */ public class RestoreIPAddresses { /** 暴力求解 需要一个辅助方法, 判断每个子串是否符合IP格式 1. 每位在0-255之间 2. 不能出现0开头的两位以上数字 */ public List restoreIpAddresses(String s) { List res = new ArrayList<>(); if (s == null || s.length() == 0 || s.length() > 12) { return res; } int n = s.length(); for (int i = 0; i < 3; i++) { for (int j = i + 1; j < i + 4; j++) { for (int k = j + 1; k < j + 4; k++) { if (j < n && k < n) { String a = s.substring(0, i + 1); String b = s.substring(i + 1, j + 1); String c = s.substring(j + 1, k + 1); String d = s.substring(k + 1); if (helper(a) && helper(b) && helper(c) && helper(d)) { StringBuilder sb = new StringBuilder(); sb.append(a) .append(".") .append(b) .append(".") .append(c) .append(".") .append(d); res.add(sb.toString()); } } } } } return res; } private boolean helper(String s) { if (s == null || s.length() == 0 || s.length() > 3 || s.charAt(0) == '0' && s.length() > 1 || Integer.parseInt(s) > 255) { return false; } return true; } /** 回溯 */ public List restoreIpAddressesII(String s) { List res = new ArrayList<>(); if (s == null || s.length() == 0 || s.length() > 12) { return res; } int n = s.length(); backtrack(0, "", 4, s, n, res); return res; } /** 回溯本体 */ private void backtrack(int start, String tmp, int flag, String s, int n, List res) { if (start == n && flag == 0) { res.add(tmp.substring(0, tmp.length() - 1)); return; } if (flag < 0) { return; } for (int j = start; j < start + 3; j++) { if (j < n) { if (start == j && s.charAt(j) == '0') { backtrack(j + 1, tmp + s.charAt(j) + ".", flag - 1, s, n, res); break; } if (Integer.parseInt(s.substring(start, j + 1)) <= 255) { backtrack(j + 1, tmp + s.substring(start, j + 1) + ".", flag - 1, s, n, res); } } } } }