LeetCode 76. Minimum Window Substring

欢迎访问原文所在博客:https://52heartz.top/articles/leetcode-76-minimum-window-substring/

解答1[Java]:

class Solution {
    public String minWindow(String s, String t) {
        int[] map = new int[128];
        for (char c : t.toCharArray()) map[c]++;
        int counter = t.length(), left = 0, right = 0, head = 0, d = Integer.MAX_VALUE;
        while (right < s.length()) {
            if (map[s.charAt(right++)]-- > 0) counter--;
            while (counter == 0) {
                if (right - left < d) d = right - (head = left);
                if (map[s.charAt(left++)]++ == 0) counter++;
            }
        }
        return d == Integer.MAX_VALUE ? "" : s.substring(head, head + d);
    }
}

思路

注意 if (map[s.charAt(right++)]-- > 0) 这句,不论 right 指向位置的字符是哪个,在判断之后都会被减去 1。因为在前边的语句中,已经预先把 t 中的字符在 map 中加 1 了,所以只有不在 t 中的字符才会被减成负数。

同理,if (map[s.charAt(left++)]++ == 0) counter++; 如果判断为真,说明 left 指针指向的字符是 t 中的一个字符,且减去这个字符之后,这个字符的数量就不够了,因此需要把 counter 加1。如果 left 指向的不是 t 中的字符,那么这个字符在 map 中的值一定是负数,因为之前 right 遍历的时候被减过。

假设 t="ABC",当 counter 为零的时候,map['A']map['B']map['C'] 其中至少有两个的值是小于等于零的。可以小于零,但至少要等于零。不然 counter 是不会为零的。

map['A'] 被减为零之后,如果再遇到字符 A,就不会再减 counter 了。因为 map['A'] 已经被减到零,说明前面已经匹配到的字符 A 的数量已经足够了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值