刷题11.8

1 复原IP地址

题目

有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。
例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效 IP 地址。
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 ‘.’ 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案

代码

class Solution {
    List<String> result =new ArrayList<>();
    List<String> path=new ArrayList<>();
    public List<String> restoreIpAddresses(String s) {
        if (s.length() > 12) return result; 
        backtracking(s,0);
        return result;
    }
    public void backtracking(String s, int start){
        if(path.size()==3){
            if(isvaild(s,start,s.length()-1)){
                path.add(s.substring(start,s.length()));
                String str=listToStringTwo(path,'.');
                result.add(str);
                path.remove(path.size()-1);
            }
            return;
        }
        for(int i=start;i<s.length();i++){
            if(isvaild(s,start,i)){
                path.add(s.substring(start,i+1));
                backtracking(s,i+1);
                path.remove(path.size()-1);
            }
            else{
                break;
            }

        }
    }
    public boolean isvaild(String s,int start,int end){
        if(start>end) return false;
        String str=s.substring(start,end+1);
        if(s.charAt(start)=='0'&& start!=end)
            return false;
        if(0<=Integer.valueOf(str) && Integer.valueOf(str)<=255)
            return true;
        else
            return false;
    }
    public String listToStringTwo(List<String> list, char separator) {  
        StringBuilder sb = new StringBuilder();  
        for (int i = 0; i < list.size(); i++) {  
            if (i == list.size() - 1) {  
                sb.append(list.get(i));  
            } else {  
                sb.append(list.get(i));  
                sb.append(separator);  
            }  
        }  
        return sb.toString();  
    } 
}

总结

哎,总算写出来了。和昨天分割回文串思想一样,就是多了好多小细节。
我的java 是真的不行,list转成string这我都得百度下
s长度大于12,可以直接返回空。(我没想到,所以我int比大小还超过了int最大整数,报错了)

2 子集

题目

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

代码

class Solution {
    List<List<Integer>> result=new ArrayList<>();
    List<Integer> path=new ArrayList<>();
    public List<List<Integer>> subsets(int[] nums) {
        result.add(new ArrayList<>(path));
        backtarcking(nums,0);
        return result;
    }
    public void backtarcking(int[] nums,int start){
        if(start>=nums.length) return;
        for(int i=start;i<nums.length;i++){
            path.add(nums[i]);
            result.add(new ArrayList<>(path));
            backtarcking(nums,i+1);
            path.remove(path.size()-1);
        }
        return;
    }
}

总结

鼓掌!!!自己写出来的,就是顺着代码运行,觉得这样可以实现。
参考代码是将result.add(path)放在了判断前面,我觉得这样理解起来更容易!而且还直接包含了空集。

3 子集II

题目

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

代码

class Solution {
    List<List<Integer>> result=new ArrayList<>();
    List<Integer> path=new ArrayList<>();
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        backtarcking(nums,0);
        return result;
    }
    public void backtarcking(int[] nums,int start){
        result.add(new ArrayList<>(path));
        if(start>=nums.length) return;
        for(int i=start;i<nums.length;i++){
            if(i>start && nums[i]==nums[i-1]) continue;
            path.add(nums[i]);
            backtarcking(nums,i+1);
            path.remove(path.size()-1);
        }
        return;
    }
}

总结

和上一题求子集类似,只是多了去重这一步。而去重这一步之前也学过,哦耶!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值