Day28题目
LeetCode93.复原ip地址:
核心思想:ip不能有长度不为1,前缀为0的值
class Solution {
List<String> res = new ArrayList<>();
// 点的个数
int pointCount = 0;
// sb存储当前的值
StringBuilder sb = new StringBuilder();
public List<String> restoreIpAddresses(String s) {
help(s,0);
return res;
}
public void help(String s, int start){
int length = s.length();
// point个数是三的时候,将剩下的值作为最后一位,添加到结果集
if(pointCount == 3){
// 最后一位不能开始为0,不能长度大于3,不能大小大于255
if(length - start > 3) return;
String temp = s.substring(start,length);
if(temp.length()>1 && temp.startsWith("0"))return;
if(Integer.parseInt(temp) > 255) return;
sb.append(temp);
res.add(sb.toString());
sb.delete(sb.length()-temp.length(),sb.length());
return;
}
for(int i = 1 ; i <= 3&& i+start < length ; i++){
// 获取从start开始,取1个到3个字符
String temp =s.substring(start,start+i);
// 这里也是同样的校验
if(temp.length()>1 && temp.startsWith("0"))return;
if(Integer.parseInt(temp) > 255) return;
sb.append(temp).append(".");
pointCount++;
// 回溯
help(s,start+i);
pointCount--;
// 删除加上的元素
if(sb.length() > i){
sb.delete(sb.length()-i-1,sb.length());
}else{
sb = new StringBuilder();
}
}
}
}
LeetCode78.子集
核心思想:包含有空集,注意加上就行,每一个元素都遍历后面的所有元素
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
help(0,nums);
// 这里加上空集
res.add(new ArrayList<>());
return res;
}
public void help(int start, int[] nums){
if(start == nums.length) return ;
// start之后的所有元素都遍历一遍
for(int i = start; i < nums.length; i ++){
path.add(nums[i]);
// 过程都加上元素
res.add(new ArrayList<>(path));
help(i+1, nums);
path.removeLast();
}
}
}
LeetCode90.子集Ⅱ
核心思想:和上面的题目额外需要进行去重
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
public List<List<Integer>> subsetsWithDup(int[] nums) {
// 排序,如果前一个元素和当前元素相同,那么就可以跳过了,跳过应该在第一层跳过
Arrays.sort(nums);
help(0,nums);
res.add(new ArrayList<>());
return res;
}
public void help( int start, int[] nums){
if(start == nums.length) return;
for(int i = start; i < nums.length ; i ++){
// i!=start 的时候那么就是同一层的遍历,如果和前一个相同,则跳过
if(i != start && i> 0 && nums[i-1] == nums[i]) continue;
path.add(nums[i]);
res.add(new ArrayList<>(path));
help(i+1,nums);
path.removeLast();
}
}
}
7524



被折叠的 条评论
为什么被折叠?



