93.复原IP地址
文章
思路
深度优先搜索,判断是否是合法字节的字符串表示,合法则添加,最后把字节的字符串表示的列表转成字符串
代码
class Solution {
private List<String> ls;
private List<String> ipPool;
private int numBytes;
private String tmp;
public List<String> restoreIpAddresses(String s) {
ls = new ArrayList<>();
ipPool = new ArrayList<>();
dfs(s, 0);
return ipPool;
}
public void dfs(String s, int start){
int i, n;
n = s.length();
if (start == n && ls.size() == 4) {
ipPool.add(convert(ls));
return;
}
for (i = start; i < n; ++i) {
if (check (s, start, i)) {
ls.add(s.substring(start, i + 1));
if (ls.size() < 5)
dfs(s, i + 1);
if (ls.size() > 0)
ls.remove(ls.size() - 1);
}
}
}
public boolean check(String s, int start, int end) {
if (end - start > 2) {
return false;
} else if (end - start > 0 && s.charAt(start) == '0') {
return false;
} else if (Integer.parseInt(s.substring(start, end + 1)) > 255) {
return false;
} else {
return true;
}
}
public String convert(List<String> ls) {
StringBuffer sb = new StringBuffer();
for (String str: ls) {
if (sb.length() > 0) {
sb.append(".");
}
sb.append(str);
}
return sb.toString();
}
}
78.子集
文章
思路
搜索过程中每得到一个新的子集,就把该子集添加到幂集中
代码
class Solution {
private List<Integer> subSet;
private List<List<Integer>> powerSet;
public List<List<Integer>> subsets(int[] nums) {
subSet = new ArrayList<>();
powerSet = new ArrayList<>();
powerSet.add(new ArrayList<Integer>());
dfs (nums, 0);
return powerSet;
}
public void dfs(int[] nums, int start) {
int i, n;
n = nums.length;
if (start == n) {
return;
}
for (i = start; i < n; ++i) {
subSet.add(nums[i]);
powerSet.add(new ArrayList<>(subSet));
dfs(nums, i + 1);
subSet.remove(subSet.size() - 1);
}
}
}
90.子集II
文章
思路
排序,每层搜索都是从下一个不同元素开始,其余做法与78题相同
代码
class Solution {
private List<Integer> subSet;
private List<List<Integer>> powerSet;
public List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums);
subSet = new ArrayList<>();
powerSet = new ArrayList<>();
powerSet.add(new ArrayList<>());
dfs (nums, 0);
return powerSet;
}
public void dfs (int[] nums, int start) {
int i, n;
n = nums.length;
if (start == n) {
return;
}
i = start;
while (i < n) {
subSet.add(nums[i]);
powerSet.add(new ArrayList<>(subSet));
dfs(nums, i + 1);
while(i < n - 1 && nums[i + 1] == nums[i]) {
++i;
}
subSet.remove(subSet.size() - 1);
++i;
}
}
}