3月15/18日:复原IP地址&子集

时间:2024-03-18 20:08:03

93.复原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 中的任何数字。你可以按 任何 顺序返回答案。

提示:

  • 1 <= s.length <= 20
  • s 仅由数字组成

思路

常规思路回溯,需要加上判断是否有前导0、单串子串大于等于0且小于等于255的判断:

class Solution {
        List<String> res=new ArrayList<>();
        int[] segments=new int[4];
        public List<String> restoreIpAddresses(String s) {

            if(s.length()>12||s.length()<4){
                return res;
            }
            dfs(s,0,0);

            return res;
        }
        public void dfs(String s,int id,int begin){
            if(id==4){
                if(begin==s.length()){
                    StringBuffer sb=new StringBuffer();
                    for(int i=0;i<4;i++){
                        sb.append(segments[i]);
                        if(i!=3){
                            sb.append('.');
                        }
                    }
                    res.add(sb.toString());
                }
                return;
            }
            if(begin==s.length()){
                return;
            }

            if(s.charAt(begin)=='0'){
                segments[id]=0;
                dfs(s,id+1,begin+1);
                return;
            }
            int temp=0;
            for(int i=begin;i<s.length();i++){
                temp=temp*10+(s.charAt(i)-'0');
                if(temp>0&&temp<=0xFF){
                    segments[id]=temp;
                    dfs(s,id+1,i+1);
                }else {
                    break;
                }
            }
        }
    }

 78.子集

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的

子集

(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

提示:

  • 1 <= nums.length <= 10
  • -10 <= nums[i] <= 10
  • nums 中的所有元素 互不相同

思路

两种方法,一种递归法,另一种迭代法,即将数组每一位是否在数组中存为0或1,这样只要遍历0到1<<n即可遍历所有情况

递归法

class Solution {
        List<List<Integer>> res=new ArrayList<>();
        List<Integer> path=new ArrayList<>();
        public List<List<Integer>> subsets(int[] nums) {

            dfs(0,nums);
            return res;
        }
        private void dfs(int cur,int[] nums){
            if(cur==nums.length){
                List<Integer> ans=new ArrayList<>(path);
                res.add(new ArrayList<>(ans));
                return;
            }
            path.add(nums[cur]);
            dfs(cur+1,nums);
            path.remove(path.size()-1);
            dfs(cur+1,nums);
        }
    }

迭代法

class Solution {
        List<List<Integer>> res=new ArrayList<>();
        List<Integer> path=new ArrayList<>();
        public List<List<Integer>> subsets(int[] nums) {
            int n=nums.length;
            for(int mask=0;mask<(1<<n);mask++){
                path.clear();
                for (int i=0;i<n;i++){
                    if ((mask & (1 << i)) != 0) {
                        path.add(nums[i]);
                    }
                }
                res.add(new ArrayList<>(path));
            }
            return res;
        }

    }

总结

常规题型。