这道题和Palindrome Partitioning很像,都是怎么切数组的问题,唯一需要注意的是ip的规定
1)不能出现0和其他数字组合, 类似0.00.01.1。0只能单独出现或者在一个片段中不为开头的数字。
2)每一个片段数字最大为255
3)只能有四个片段
4)这里需要注意一个细节: 在这里加入sub.length()>3就无需继续的原因也是避免sub过大,超过integer,从而使Integer.parseInt(s) threw exception
public class Solution { /** * @param s the IP string * @return All possible valid IP addresses */ public ArrayList<String> restoreIpAddresses(String s) { // Write your code here ArrayList<String> result = new ArrayList<String>(); if("".equals(s)){ return result; } List<String> ips = new ArrayList<String>(); helper(result, ips, s, 0); return result; } private void helper(ArrayList<String> result, List<String> ips, String s, int start){ if(start == s.length() && ips.size() == 4){ StringBuilder ip = new StringBuilder(); for(String ipPart : ips){ ip.append(ipPart); ip.append(‘.‘); } result.add(ip.deleteCharAt(ip.length()-1).toString()); return; } for (int i = start; i < s.length(); i++){ String sub = s.substring(start, i+1); if(sub.length()>3 || ips.size()>4 || isZeroStart(sub) || Integer.parseInt(sub)>255){ continue; } ips.add(sub); helper(result, ips, s, i+1); ips.remove(ips.size()-1); } } private boolean isZeroStart(String s){ if(‘0‘ == s.charAt(0) && s.length() > 1){ return true; } return false; } }
时间: 2024-11-13 18:23:58