栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

剑指offer 专项突破版 17、含有所有字符的最短字符串

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

剑指offer 专项突破版 17、含有所有字符的最短字符串

题目链接

哈希表+双指针

思路一

首先用一个哈希表记录t中所有的字符,出现后对应位置数量–(可以用数组模拟,如果说是字母需要开的大小是58,如果说是小写字母or大写字母,要开的大小是26)然后双指针遍历s,需要注意三点

一个数组即可

判断现在是否包含s应该判断int数组是否每一位都>=0

在移动了left后要进行标记,方便后续更新子数组间距

while (isContains(charNums)) {
    charNums[s.charAt(left++) - 'A']--;
    flag = true;
}
if (flag) {
    if (right - left < end - begin) {
        begin = left - 1;
        end = right;
    }

PS:也可以把更新放到while循环中

class Solution {

    boolean isContains(int[] nums) {
        for (int num : nums) {
            if (0 > num)
                return false;
        }
        return true;
    }

    public String minWindow(String s, String t) {
        int[] charNums = new int[60];
        int begin = 0, end = Integer.MAX_VALUE, left = 0, right = t.length();
        boolean flag = false;

        if(t.length() > s.length())
            return "";

        for (int i = 0; i < t.length(); i++) {
            charNums[t.charAt(i) - 'A']--;
            charNums[s.charAt(i) - 'A']++;
        }
        if (isContains(charNums))
            end = t.length();

        while (right < s.length()) {
            charNums[s.charAt(right++) - 'A']++;
            while (isContains(charNums)) {
                charNums[s.charAt(left++) - 'A']--;
                flag = true;
            }
            if (flag) {
                if (right - left < end - begin) {
                    begin = left - 1;
                    end = right;
                }
                flag = false;
            }
        }
        return end == Integer.MAX_VALUE ? "" : s.substring(begin, end);
    }
}
思路二

直接使用哈希表,同样是对于t中出现的字符,直接记录到表中(出现一次,次数-1)为了避免每一次在判断是否是子字符串时都要遍历哈希表的全部,我们维护了一个count变量,注意代码中对count变量的操作(这个方法中我们把更新left和更新子字符串的长度放到了一起)

class Solution {

    public String minWindow(String s, String t) {
        int left = 0, right = 0, minLeft = 0, minRight = Integer.MAX_VALUE, count = 0;
        HashMap charToCount = new HashMap<>();

        if (minRight < right)
            return "";

        for (Character ch : t.toCharArray()) {
            int time = charToCount.getOrDefault(ch, 0);
            if (0 == time)
                count++;
            charToCount.put(ch, time - 1);
        }

        while (right < s.length() &&  left <= right || 0 == count) {
            //此时并未包含所有 t 中的字符
            if (0 != count) {
                char ch = s.charAt(right++);
                //如果字符 ch 是t中的某一个字符
                if (charToCount.containsKey(ch)) {
                    int time = charToCount.get(ch) + 1;
                    charToCount.put(ch, time);
                    if (0 == time)
                        count--;
                }
            } else {
                if (right - left < minRight - minLeft) {
                    minRight = right;
                    minLeft = left;
                }
                char ch = s.charAt(left++);
                if (charToCount.containsKey(ch)) {
                    int time = charToCount.get(ch) - 1;
                    charToCount.put(ch, time);
                    if (-1 == time)
                        count++;
                }
            }
        }
        return minRight == Integer.MAX_VALUE ? "" : s.substring(minLeft, minRight);
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/759722.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号