nt cnts[128]{}; 声明了一个长度为128的整型数组,所有元素被初始化为0。

  • int cnts[128]:定义数组大小为128。
  • {}:C++11的列表初始化语法,表示默认初始化(对内置类型如int,默认值为0)。

题目

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

涵盖的意思

s中每个字母出现次数大于等于t中每个字母出现次数

滑动窗口如何滑动

枚举s子串的右端点,如果子串涵盖t,就不断移动左端点left直到不涵盖为止。在移动过程中更新最短子串的左右端点。

  1. 初始化 ansleft=-1,ansright=m,记录最短子串的左右端点,m为S的长度。
  2. 用一个数组或者哈希表cnt来统计t中每个字母的出现次数
  3. 初始化left=0,以及一个空哈希表或数组cnts,用来统计s子串中每个字母的出现次数。

以上 s t ans的初始化

  1. 遍历s,设当前枚举的子串右端点为right,把s[right]的出现次数+1
  2. 遍历cnts 中的每个字母及其出现次数,如果出现次数都大于等于cntt中字母出现次数:
    1. 若right-left<ansright-ansleft,说明我们找到了更短的子串,更新ansleft=left,ansright=right
    2. 把s[left]出现次数-1
    3. 左端点右移,left+1
    4. 重复上述三个步骤 直到cnts有字母的出现次数小于cntt中该字母的出现次数为止

substr(pos, len)