首页 > 编程语言 >算法-2023.2.3

算法-2023.2.3

时间:2023-02-04 10:45:57浏览次数:46  
标签:map HashMap temp int 2023.2 算法 root dp

1.最小覆盖子串

class Solution {
    public String minWindow(String s, String t) {
        HashMap<Character, Integer> map1 = new HashMap<>();
        HashMap<Character, Integer> map2 = new HashMap<>();
        int m = s.length(), n = t.length();
        boolean flag = false;
        for(int i = 0;i<n;i++){
            map1.put(t.charAt(i), map1.getOrDefault(t.charAt(i), 0)+1);
        }
        Deque<Character> queue = new LinkedList<>();
        int cnt = 0;
        String res = s;
        for(int i = 0, j = 0;j<m;j++){
            char temp = s.charAt(j);
            queue.addLast(temp);
            if(map1.containsKey(temp)){
                int a = map1.get(temp);
                if(map2.containsKey(temp)){
                    int b = map2.get(temp);
                    if(a>b){
                        map2.put(temp,b+1);
                        cnt++;
                    }else{
                        map2.put(temp,b+1);
                    }
                }else{
                    map2.put(temp,1);
                    cnt++;
                }
            }
            while(i<j){
                char temp1 = s.charAt(i);
                if(!map2.containsKey(temp1)){
                    queue.removeFirst();
                    i++;
                }else{
                    int p = map1.get(temp1), q = map2.get(temp1);
                    if(q>p){
                        map2.put(temp1,q-1);
                        queue.removeFirst();
                        i++;
                    }else{
                        break;
                    }
                }
            }
            //System.out.println(cnt);
            if(cnt == n){
                if(queue.size()<=res.length()){
                    flag = true;
                    StringBuilder string = new StringBuilder();
                    for(char cur : queue){
                        string.append(cur);
                    }
                    res = string.toString();
                    //System.out.println(res);

                }
            }
        }
        if(flag == false){
            return "";
        }
        return res;

    }
}

2.找到字符串中所有字母异位词

class Solution {
    //滑动窗口算法+哈希表存储
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer> res = new LinkedList<>();
        //这个哈希表存储子串的结构
        HashMap<Character, Integer> map1 = new HashMap<>();
        //这个哈希表存储当前滑动窗口的元素。
        HashMap<Character, Integer> map2 = new HashMap<>(); 
        int m = s.length(), n = p.length();
        for(int i = 0;i<n;i++){
            map1.put(p.charAt(i), map1.getOrDefault(p.charAt(i),0)+1);
        }
        //cnt代表了滑动窗口中所需的元素个数
        int cnt = 0;
        for(int i = 0, j = 0;j<m;j++){
            //遍历当前元素
            char temp = s.charAt(j);
            //如果该元素值存在于子串中
            if(map1.containsKey(temp)){
                int a = map1.get(temp);
                //判断滑动窗口中概元素值的个数与总个数
                if(map2.containsKey(temp)){
                    int b = map2.get(temp);
                    //如果不够,则加入该元素
                    if(a>b){
                        map2.put(temp,b+1);
                        cnt++;
                    //如果超出则遍历左断点,一次出来滑动窗口的值,直到遇到该元素(因为这里要求连续)
                    }else{
                        while(s.charAt(i)!=temp&&i<j){
                            if(map2.containsKey(s.charAt(i))){
                                map2.put(s.charAt(i), map2.getOrDefault(s.charAt(i),0)-1);
                                cnt--;
                            }
                            i++;
                        }
                        i++;
                    }
                    //如果滑动窗口不存在该元素,但该元素属于子川,则加一
                }else{
                    map2.put(temp,1);
                    cnt++;
                }
                //如果该元素不属于子川,因为要求连续存储,所以这里会将滑动窗口清空
            }else{
                for(char tt : map2.keySet()){
                    map2.put(tt,0);
                }
                cnt = 0;
                i = j+1;
            }//滑动窗口元素满足要求,则加入左端点
            if(cnt == n){
                res.add(i);
            }
        }
        return res;

    }
}

3.正则表达式匹配

class Solution {
    public boolean isMatch(String s, String p) {
        int m = s.length() + 1, n = p.length() + 1;
        boolean[][] dp = new boolean[m][n];
        dp[0][0] = true;
        for(int j = 2; j < n; j += 2)
            dp[0][j] = dp[0][j - 2] && p.charAt(j - 1) == '*';
        for(int i = 1; i < m; i++) {
            for(int j = 1; j < n; j++) {
                dp[i][j] = p.charAt(j - 1) == '*' ?
                    dp[i][j - 2] || dp[i - 1][j] && (s.charAt(i - 1) == p.charAt(j - 2) || p.charAt(j - 2) == '.') :
                    dp[i - 1][j - 1] && (p.charAt(j - 1) == '.' || s.charAt(i - 1) == p.charAt(j - 1));
            }
        }
        return dp[m - 1][n - 1];
    }
}

4.路径总和3

class Solution {
    public HashMap<Long, Integer> map;
    public long temp,target;
    public int res;    
    public int pathSum(TreeNode root, int targetSum) {
        map = new HashMap<>();
        map.put(0L,1);
        target = (long)targetSum;
        temp = 0L;res = 0;
        dfs(root);
        return res;
    }
    public void dfs(TreeNode root){
        if(root == null){
            return;
        }
        temp += root.val;
        long t = temp - target;
        if(map.containsKey(t)){
            res += map.get(t);
        }
        map.put(temp,map.getOrDefault(temp,0)+1);
        dfs(root.left);
        if(root.left!=null){
            map.put(temp,map.get(temp)-1);
            temp-=root.left.val;
        }
        dfs(root.right);
        if(root.right!=null){
            map.put(temp,map.get(temp)-1);
            temp-=root.right.val;
        }


    }
}

  

  

  

  

标签:map,HashMap,temp,int,2023.2,算法,root,dp
From: https://www.cnblogs.com/lyjps/p/17091030.html

相关文章

  • Berlekamp-Massey 算法
    整了个比较精简的线性递推之后算是敢写各种需要线性递推的东西了。这玩意的用处是求数列的最短线性递推式。实际上的用途一般就是打表。有时候也可以素质二连\(O(k^2+k\l......
  • 2023.2
    1.PastoralOddities当\(n\)为奇数的时候,\(\sumdeg\)是奇数,但显然它应该是偶数,换言之\(n\)为奇数一定无解。事实上只要一个连通块是偶数它内部就有解:只用考虑一颗......
  • 算法刷题 Day 30 | ● 332.重新安排行程 ● 51. N皇后 ● 37. 解数独
    详细布置今天这三道题都非常难,那么这么难的题,为啥一天做三道?因为一刷也不求大家能把这么难的问题解决,所以大家一刷的时候,就了解一下题目的要求,了解一下解题思路,......
  • 浅谈最短路算法在信息学竞赛中的应用
    最短路温馨提示:如果下文档中没有做特殊提示,默认所有下标从\(1\)开始,并且默认\(n,m\)同阶因为在生活当中,路径的长度大多为正数,没有特殊说明,不考虑长度为负数的情况\(s\)......
  • 贪心算法学习笔记
    贪心算法学习笔记目录贪心算法学习笔记1,什么是贪心算法2,什么时候使用贪心算法3,贪心算法的解题步骤1,什么是贪心算法贪心算法就是以每次都选局部最优,以期望得出全局最优的......
  • 算法学习笔记(12): 线性基
    线性基熟练掌握异或运算是食用本文的大前提,请读者留意是什么?是一种利用线性代数的知识,用于解决异或问题的一种手段(不能算作数据结构吧这)本文并不会涉及到线性代数。......
  • 2023.2.3
    向上转型向下转型子类类型引用名=(子类类型)父类引用;(基本数据类型的强制转换)只能强转父类引用,不能强转父类对象;父类引用指向的必须是当前目标类型的对象;向下转型后,......
  • OpenMMLab AI实战营 第二课笔记 计算机视觉之图像分类算法基础
    OpenMMLabAI实战营第二课笔记计算机视觉之图像分类算法基础1.什么是图像分类?1.1问题的数学表示1.2视觉任务的难点1.2.1超越规则:让机器从数据中学习1.2.2机......
  • 代码随想录算法训练营第十七天 | 110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和
    一、昨日回顾与补充今天看了Day16讲解的视频,对于求二叉树最大深度、最小深度以及求完全二叉树的节点个数有了新的理解,总结如下:1.深度和高度的区别(之前就看看定义忽略......
  • 算法刷题 Day 29 | 491.递增子序列 46.全排列 47.全排列 II
    详细布置491.递增子序列本题和大家刚做过的90.子集II非常像,但又很不一样,很容易掉坑里。https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F......