一. 题目

二. 思路

  • 双指针

  • 优化:用一个diff记录cnts和cntt差异数,当差异为0时,表示cntss包含cntt,这样无需循环检查两个数组。

  • O(m+n)

三. 代码

class Solution
{
    static final int N = 150, INF = Integer.MAX_VALUE;
    int[] cnts = new int[N], cntt = new int[N];

    public String minWindow(String s, String t)
    {
        int diff = 0;
        for (Character c : t.toCharArray())
            if (++cntt[c] == 1)//第一次出现时,统计差异数
                ++diff;

        int ansl = -1, len = Integer.MAX_VALUE;//记录起点和长度
        for (int l = 0, r = 0; r < s.length(); ++r)
        {
            int c = s.charAt(r);
            if (++cnts[c] == cntt[c]) --diff;//第一次相等,则减少差异
            while (diff == 0)//当差异为0时,左指针可以右移
            {
                if (r - l + 1 < len)
                {
                    len = r - l + 1;
                    ansl = l;
                }

                c = s.charAt(l++);
                if (--cnts[c] < cntt[c]) ++diff;//若l右移,导致不满足了,则差异变大
            }
        }
        return ansl == -1 ? "" : s.substring(ansl, ansl + len);
    }
}