注册
web

【算法】最小覆盖子串

难度:困难


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


注意:



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

示例 1:


输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
解释:最小覆盖子串 "BANC" 包含来自字符串 t 的 'A''B''C'

示例 2:


输入:s = "a", t = "a"
输出:"a"
解释:整个字符串 s 是最小覆盖子串。

示例 3:


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

提示:



  • m == s.length
  • n == t.length
  • 1 <= m, n <= 105
  • st 由英文字母组成

解题思路:



  1. 初始化计数器:创建两个哈希表,一个用于存储字符串t中每个字符的出现次数,另一个用于存储当前窗口内每个字符的出现次数。
  2. 设定窗口:初始化窗口的左边界left和右边界right,以及一些辅助变量如required(表示t中不同字符的数量)、formed(表示当前窗口内满足t字符要求的数量)、windowCounts(表示当前窗口内字符的计数)。
  3. 扩展窗口:将right指针从0开始向右移动,直到窗口包含了t中的所有字符。在每次移动right指针时,更新窗口内的字符计数和formed变量。
  4. 收缩窗口:一旦窗口包含了t中的所有字符,开始移动left指针以尝试缩小窗口,同时更新窗口内的字符计数和formed变量。记录下最小覆盖子串的信息。
  5. 重复步骤3和4:继续移动right指针,重复上述过程,直到right指针到达s的末尾。
  6. 返回结果:最后返回最小覆盖子串。

JavaScript实现:


/**
* @param {string} s
* @param {string} t
* @return {string}
*/
var minWindow = function(s, t) {
const need = {}, windowCounts = {};
let left = 0, right = 0;
let valid = 0;
let start = 0, length = Infinity;

// Initialize the need counter with characters from t.
for(let c of t){
need[c] ? need[c]++ : need[c] = 1;
}

// Function to check if the current window satisfies the need.
const is_valid = () => Object.keys(need).every(c => (windowCounts[c] || 0) >= need[c]);

while(right < s.length){
const c = s[right];
right++;

// Increment the count in the windowCounts if the character is needed.
if(need[c]){
windowCounts[c] ? windowCounts[c]++ : windowCounts[c] = 1;
if(windowCounts[c] === need[c])
valid++;
}

// If the current window is valid, try to shrink it from the left.
while(valid === Object.keys(need).length){
if(right - left < length){
start = left;
length = right - left;
}

const d = s[left];
left++;

// Decrement the count in the windowCounts if the character is needed.
if(need[d]){
if(windowCounts[d] === need[d])
valid--;
windowCounts[d]--;
}
}
}

return length === Infinity ? '' : s.substring(start, start + length);
};、

作者:时清云
来源:juejin.cn/post/7410299130280722470

0 个评论

要回复文章请先登录注册