LeetCode-93. Restore IP Addresses (JAVA)(重新组合IP)

来源:互联网 发布:知乎 庞麦郎 编辑:程序博客网 时间:2024/06/05 02:34

93. Restore IP Addresses

Given a string containing only digits, restore it by returning all possible valid IP address combinations.

For example:
Given "25525511135",

return ["255.255.11.135", "255.255.111.35"]. (Order does not matter)

backtracking, 找出第一部分合法的IP, 剩余部分变成相似子问题。

public List<String> restoreIpAddresses(String s) {List<String> res = new ArrayList<String>();if (s.length() < 4 || s.length() > 12)return res;dfs(s, "", res, 1);return res;}public void dfs(String s, String temp, List<String> res, int count) {if (count == 4 && isValid(s)) {res.add(temp + s);return;}// Math.min(4, s.length())后面几位少于4的情况比如,0000for (int i = 1; i < Math.min(4, s.length()); i++) {String cur = s.substring(0, i);if (isValid(cur)) {// i 是beginIndexdfs(s.substring(i), temp + cur + ".", res, count + 1);}}}public boolean isValid(String s) {// 前导0,如果第一个字符是0,只能一个为0if (s.charAt(0) == '0')return s.equals("0");int num = Integer.parseInt(s);return 0 < num && num < 256;}

discuss:回溯

public List<String> restoreIpAddresses(String s) {List<String> res = new ArrayList<>();helper(s, "", res, 0);return res;}public void helper(String s, String tmp, List<String> res, int n) {// 剪枝,因ip不会超过三位if (s.length() > 3 * (4 - n))return;if (n == 4) {if (s.length() == 0)// substring here to get rid of last '.'// 去掉最后一个'.'res.add(tmp.substring(0, tmp.length() - 1));return;}for (int k = 1; k <= 3; k++) {// 如果剩余的长度还不够k那么说明不能排列成ipif (s.length() < k)break;int val = Integer.parseInt(s.substring(0, k));// in the case 010 the parseInt will return len=2// where val=10, but k=3, skip this.// k != String.valueOf(val).length(),为了避免前导0情况if (val > 255 || k != String.valueOf(val).length())continue;helper(s.substring(k), tmp + s.substring(0, k)+ ".", res, n + 1);}}
直接使用循环:

public List<String> restoreIpAddresses(String s) {List<String> res = new ArrayList<String>();int len = s.length();for (int i = 1; i < 4 && i < len - 2; i++) {for (int j = i + 1; j < i + 4 && j < len - 1; j++) {for (int k = j + 1; k < j + 4 && k < len; k++) {String s1 = s.substring(0, i), s2 = s.substring(i, j), s3 = s.substring(j, k),s4 = s.substring(k, len);if (isValid(s1) && isValid(s2)&& isValid(s3) && isValid(s4)) {res.add(s1 + "." + s2 + "." + s3 + "." + s4);}}}}return res;}public boolean isValid(String s) {if (s.length() > 3 || s.length() == 0 || (s.charAt(0) == '0' && s.length() > 1) || Integer.parseInt(s) > 255)return false;return true;}


0 0
原创粉丝点击