ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LC-76

2022-03-09 18:33:21  阅读:170  来源: 互联网

标签:hash String int res chars fastIndex 76 LC


给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。

注意:

对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
如果 s 中存在这样的子串,我们保证它是唯一的答案。

示例 1:

输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
示例 2:

输入:s = "a", t = "a"
输出:"a"
示例 3:

输入: s = "a", t = "aa"
输出: ""
解释: t 中两个字符 'a' 均应包含在 s 的子串中,
因此没有符合条件的子字符串,返回空字符串。

提示:

1 <= s.length, t.length <= 105
s 和 t 由英文字母组成

进阶:你能设计一个在 o(n) 时间内解决此问题的算法吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-window-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

利用ASCII码来映射(双指针)

public class LC76 {
    public static void main(String[] args) {
        String s = "ADOBECODEBANC";
        String t = "ABC";
        System.out.println(minWindow(s, t));
        System.out.println(Solution.minWindow(s, t));
    }

    /**
     * @param s
     * @param t
     * @return
     */
    public static String minWindow(String s, String t) {
        char[] chars = s.toCharArray();
        char[] chart = t.toCharArray();
        int sLength = chars.length, tLength = chart.length;
        String res = "";
        int countMin = 0;
        int[] hash = new int[128];

        for (int i = 0; i < tLength; i++) {
            hash[chart[i]]--;
        }

        for (int fastIndex = 0, slowIndex = 0; fastIndex < sLength; fastIndex++) {
            hash[chars[fastIndex]]++;
            if (hash[chars[fastIndex]] <= 0) countMin++;
            while (countMin == tLength && hash[chars[slowIndex]] > 0) {
                hash[chars[slowIndex++]]--;
            }
            if (countMin == tLength) {
                if (res.equals("") || res.length() > fastIndex - slowIndex + 1) {
                    res = s.substring(slowIndex, fastIndex + 1);
                }
            }
        }
        return res;
    }
}

class Solution {
    /**
     * @param s
     * @param t
     * @return
     */
    public static String minWindow(String s, String t) {
        //字符串转回字符数组
        char[] chars = s.toCharArray();
        char[] chart = t.toCharArray();
        int sLength = chars.length, tLength = chart.length;
        //如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 ""
        String res = "";
        //最小子串,计数变量
        int countMin = 0;
        //利用ASCII码来映射,t中含有的字符--
        int[] hash = new int[128];

        //t中含有的字符,hash数组中赋值-n,t中可能重复字符
        for (int i = 0; i < tLength; i++) {
            hash[chart[i]]--;
        }

        //开始判断
        for (int fastIndex = 0, slowIndex = 0; fastIndex < sLength; fastIndex++) {
            //s中有,相应的位置++
            hash[chars[fastIndex]]++;
            //这个位置映射的数字要是还是小于0,表明有相同的字符
            if (hash[chars[fastIndex]] <= 0) countMin++;
            //如果这个子字符串已经有了所有的t中的字符,映射位置flag数值还原
            while (countMin == tLength && hash[chars[slowIndex]] > 0) {
                hash[chars[slowIndex++]]--;
            }
            //如果计数等于t的长度,返回结果
            if (countMin == tLength) {
                //判断是否是不存在
                if (res.equals("") || res.length() > fastIndex - slowIndex + 1) {
                    res = s.substring(slowIndex, fastIndex + 1);
                }
            }
        }
        return res;
    }
}

标签:hash,String,int,res,chars,fastIndex,76,LC
来源: https://www.cnblogs.com/zwtblog/p/15986457.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有