• 76. Minimum Window Substring


    一、题目

      1、审题

      

      2、分析

        给出两个字符串 s 与 t,求 t 中所有字符在 s 中都出现的最短长度的 s 的一个子串。若 s 中不存在这样的子串,返回空。

    二、解答

      1、思路:

        ①、用 HashMap 存储 t 的字符,其中 key 为 字符, value 为出现的次数。

        ②、遍历 s 中的字符,并判断是否是 t 中的待匹配的字符,

            若是,则记录匹配的字符的变量 count++;同时,map 中的对应的 --value;

            若不是,继续遍历。

        ③、若 count == t.length(),则此时找到 s 的一个匹配的子串。

            判断该子串是否长度更小,若是,则进行下标的记录。

            指向该子串左端的指针开始右移动,同时 Map中的 value 进行更改,并且 count--;

        ④、遍历完成后,输出。

    public String minWindow(String s, String t) {
        
            int len1 = s.length();
            int len2 = t.length();
            
            if(len1 == 0 || len2 == 0 || len1 < len2)
                return "";
            
            Map<Character, Integer> map = new HashMap<Character, Integer>();
            for(char c: t.toCharArray())
                if(map.containsKey(c))
                    map.put(c, map.get(c) + 1);
                else
                    map.put(c, 1);
            
            
            int left = 0;    // 当前查找的子串的开始
            int minLeft = 0;    // 总的最小子串的开始
            int minLen = len1 + 1;    // 记录最小子串的长度
            int count = 0;    // t 中匹配的字符的个数
            for(int right = 0; right < s.length(); right++) {
                char c = s.charAt(right);
                Integer value = map.get(c);
                if(map.containsKey(c)) {
                    map.put(c, --value);
                    if(value >= 0) 
                        count++;
                }
                
                // 还原 Map 值
                while(count == len2) {
    
                    if(right - left + 1 < minLen) {    // 这个串更小
                        minLeft = left;
                        minLen = right - left + 1;
                    }
                    c = s.charAt(left);
                    if(map.containsKey(c)) {
                        value = map.get(c);
                        map.put(c, ++value);
                        if(value > 0)
                            count--;
                    }
                    left++;    // 
                }
            }
            
            if(minLen > len1)
                return "";
            
            return s.substring(minLeft, minLeft + minLen);
        }
  • 相关阅读:
    IDEA常用快捷键整理(Mac OS X版本)
    转发与重定向的区别
    关于Navicat远程连接远程服务器的mysql 报错问题
    关于mac 系统如何通过终端 连接linux服务器 并传文件!
    Java中String和byte[]间的转换浅析
    选择排序Java版
    插入排序Java版
    JS知识点
    Excel 函数
    垂直滚动公告板
  • 原文地址:https://www.cnblogs.com/skillking/p/9691483.html
Copyright © 2020-2023  润新知