2021-12-23 187. 重复的DNA序列 3. 无重复字符的最长子串 209. 长度最小的子数组 77. 组合

187. 重复的DNA序列

class Solution {
    public List<String> findRepeatedDnaSequences(String s) {
        int n=s.length();
        ArrayList<String> list=new ArrayList<>();
        if(n<10) return list;
        HashMap<String,Integer> map=new HashMap<>();
        for(int i=0;i<=n-10;i++){
            String temp=s.substring(i,i+10);
            map.put(temp,map.getOrDefault(temp,0)+1);
            if(map.get(temp)==2) list.add(temp);
        }
        return list;
    }
}

3. 无重复字符的最长子串

class Solution {
    public int lengthOfLongestSubstring(String s) {
        HashMap<Character,Integer> map=new HashMap<>();
        int n=s.length();
        int max=0;
        int left=0;
        for(int i=0;i<n;i++){
        if(map.containsKey(s.charAt(i))  ){
            //主要思想在于移动做左侧的标记位置,发现重复字符后,判断和当前的起始位置进行比较,来进行左边界的更新
                left=Math.max(left,map.get(s.charAt(i))+1);
                }
                map.put(s.charAt(i),i);
                max=Math.max(max,i-left+1);
        }
    return max;
    }
}

209. 长度最小的子数组

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int sum=0;
        for(int num:nums) sum+=num;
        if(sum<target) return 0;
        int min=nums.length;
        int left=0;
        sum=0;
        for(int i=0;i<nums.length;i++){
            sum+=nums[i];
                while(sum>=target){
                    min=Math.min(min,i-left+1);
                    sum-=nums[left];
                    left++;
            }
        }
    return min;
    }
}

77. 组合

class Solution {
    List<List<Integer>> res=new ArrayList<>();
    List<Integer> path=new ArrayList<>();
    public List<List<Integer>> combine(int n, int k) {
    backtracking(n,k,1);
    //  backtracking(n,k,0);
    return res;
    }

public void backtracking(int n,int k,int index){
       if(path.size()==k){
          res.add(new ArrayList<>(path));
          return;
        }
      //注意:这里的第一个数从一开始而不是0  
    // for(int i=index;i<n;i++){
    for(int i=index;i<=n;i++){
         //if(path.size()==k){
      //      res.add(new ArrayList<>(path));
       //     return;
       // }
        path.add(i);
        backtracking(n,k,i+1);
        path.remove(path.size()-1);
    }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值