Day28 回溯算法 part04
我的思路:
在分割回文串代码的基础上改写,需要考虑多种情况
不合法的IP地址part:长度>1同时首数字为0 || 长度=0 || 长度>3 || >255
将各个part结合起来添加 "." 的时候,需要分前三part和最后一个,因此回溯完删除的范围也需要分别考虑
java
class Solution {
public List<String> res = new ArrayList();
public StringBuffer path = new StringBuffer();
public List<String> restoreIpAddresses(String s) {
if(s == null || s.length() == 0) {
return new ArrayList();
}
backtracing(s, 0, 0);
return res;
}
public void backtracing(String s, int startIndex, int partNum) {
if(partNum == 4) {
if(startIndex == s.length()) {
StringBuffer sb = new StringBuffer(path);
res.add(sb.toString());
}
return;
}
for(int i = startIndex; i < s.length(); i++) {
String part = s.substring(startIndex, i + 1);
if(isValid(part)) {
if(partNum < 3) {
path.append(part);
path.append('.');
backtracing(s, i + 1 , partNum + 1);
path.delete(path.length() - part.length() - 1, path.length());
}
else {
path.append(part);
backtracing(s, i + 1, partNum + 1);
path.delete(path.length() - part.length(), path.length());
}
}
else {
break;
}
}
}
public boolean isValid(String s) {
if(s.length() == 0 || s.length() > 3 || (s.charAt(0) == '0' && s.length() > 1)
|| Integer.parseInt(s) > 255) {
return false;
}
return true;
}
}
我的思路:
不需要考虑返回情况,将path全部加到result集合中
解答:
java
class Solution {
public List<Integer> path = new ArrayList();
public List<List<Integer>> res = new ArrayList();
public List<List<Integer>> subsets(int[] nums) {
Arrays.sort(nums);
backtracing(nums, 0);
return res;
}
public void backtracing(int[] nums, int startIndex) {
res.add(new ArrayList(path));
for(int i = startIndex; i < nums.length; i++) {
path.add(nums[i]);
backtracing(nums, i+1);
path.remove(path.size() - 1);
}
}
}
我的思路:
在上一题的基础上,判断要添加到path,在result里面是不是已经存在
另外模仿组合的做法进行了剪枝
解答:
java
class Solution {
public List<Integer> path = new ArrayList();
public List<List<Integer>> res = new ArrayList();
public List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums);
backtracing(nums, 0);
return res;
}
public void backtracing(int[] nums, int startIndex) {
if(hasNums(path, res)) {
res.add(new ArrayList(path));
}
for(int i = startIndex; i < nums.length; i++) {
if(i > startIndex && nums[i] == nums[i-1]) {
continue;
}
path.add(nums[i]);
backtracing(nums, i+1);
path.remove(path.size() - 1);
}
}
public boolean hasNums(List<Integer> path, List<List<Integer>> res) {
for(List l : res) {
if(path.equals(l)){
return false;
}
}
return true;
}
}