dfs求所有符合条件的地址,求解的过程中,注意每次截取数字是有限制的。
int len = s.length(); int min = Math.max(1, len - (3 - num) * 3); int max = Math.min(3, len - (3 - num));这三行代码的意思是:假如当前字符串的长度为len,并且已经组成了num段ip,那么
1)、可以截取的最小长度是当前长度减去剩余需要组成的ip段长度*3和1的最大值。比如当前字符串长度为11,已组成0段,那么第一段的最小长度应该是
int min = Math.max(1, 11 - (3 - 0) * 3);之所以这么做是因为,如果第1段长度为1,那么剩下的3段分10个数,必然有不合要求的。
2)、可以截取的最大长度是当前长度减去剩余需要组成ip段长度和3的最小值。比如当前字符串长度为11,已组成0段,那么第一段的最大长度应该是
int max = Math.min(3, 11 - (3 - 0));之所以这么做是因为,如果第1段长度为8,比3个数多,不符合要求。
Java AC
public class Solution { public ArrayList<String> restoreIpAddresses(String s) { ArrayList<String> list = new ArrayList<String>(); dfs(list, s, new StringBuffer(), 0); return list; } private void dfs(ArrayList<String> list, String s, StringBuffer sb, int num) { if (num == 4) { list.add(sb.toString()); return; } int len = s.length(); int min = Math.max(1, len - (3 - num) * 3); int max = Math.min(3, len - (3 - num)); int end = min; while (end >= min && end <= max) { String news = s.substring(0, end); if(end != 1 && news.charAt(0) == '0'){ break; } int tempNum = Integer.parseInt(news); if (tempNum >= 0 && tempNum < 256) { StringBuffer newsb = new StringBuffer(sb); if (!"".equals(newsb.toString())) { newsb.append("."); } newsb.append(news); dfs(list, s.substring(end), newsb, num + 1); } end++; } } }