93. Restore IP Addresses
- 思路
-
java class Solution { List result = new ArrayList(); public List restoreIpAddresses(String s) { if(s.length() > 12){ return result; } helper(s, 0, 0); return result; } private void helper(String s, int startIndex, int pointNum){ if(pointNum == 3){ if (isValid(s, startIndex, s.length() - 1)){ result.add(s); } return; } if(pointNum > 3 || (pointNum == 3 && !isValid(s,startIndex, s.length()-1))){ return; //剪枝 } for(int i = startIndex; i < s.length(); i++){ if(isValid(s, startIndex, i)){ s = s.substring(0, i + 1) + "." + s.substring(i + 1); pointNum ++; helper(s, i + 2, pointNum);//i+2是因为之前加了个"." pointNum--; s = s.substring(0, i+1) + s.substring(i + 2); }else{ break; } } } private boolean isValid(String s, int start, int end){ if(start > end || (end - start >2)){ //这里要确保每次用来比较的数是小于等于3位的,要不然用Integer.parseInt()方法可能会遇到过大的数字 return false; } if(s.charAt(start) == '0' && start != end){ return false; } int num =0; //for 循环str转数字可以用Intger.parseInt(str)来代替 //String str = s.substring(start, end+1); //int num = Integer.parseInt(str); for(int i = start; i< end +1; i++){ if(s.charAt(i) > '9' || s.charAt(i) < '0'){ return false; } num = num * 10 +(s.charAt(i) - '0'); if(num >255){ return false; } } return true; } }
- 78. Subsets
- 思路
-
java class Solution { List> result = new ArrayList(); LinkedList path = new LinkedList(); public List> subsets(int[] nums) { helper(nums, 0); return result; } private void helper(int[] nums, int startIndex){ result.add(new ArrayList(path)); if(startIndex >= nums.length){ return; } for(int i = startIndex; i < nums.length; i++ ){ path.add(nums[i]); helper(nums, i + 1); path.removeLast(); } } }
-
-
90. Subsets II
- 思路
- backtrack, dfs
- sort的原因是要比较前后重复的数
- 如果不sort,就要采用[[491. Increasing Subsequences]]中的方法
-
java class Solution { List> result = new ArrayList(); LinkedList path = new LinkedList(); boolean mark = false; public List> subsetsWithDup(int[] nums) { Arrays.sort(nums); helper(nums, 0, mark); return result; } private void helper(int[] nums, int startIndex, boolean mark){ result.add(new ArrayList(path)); if(startIndex == nums.length){ return; } for(int i = startIndex; i < nums.length; i++){ if(i >0 && nums[i] == nums[i-1] && !mark ){ continue; } path.add(nums[i]); mark = true; helper(nums, i+1, mark); path.removeLast(); mark = false; } } }