题解 | #牛群名字覆盖#
题目考察的知识点
- 字符串处理:题目要求通过字符串处理的方法来找出最短的名字序列,需要熟悉字符串的操作,如统计字符出现次数、子串截取等。
- 窗口滑动法:解题方法使用了窗口滑动的思想,通过维护一个窗口来寻找包含所有指定英文字母的最短名字序列。
题目解答方法的文字分析
- 统计指定英文字母集合中每个字母的出现次数,存储到charCountT对象中。
- 遍历名字序列,维护一个窗口,同时统计窗口内每个字母的出现次数,如果当前字母是指定英文字母且出现次数满足条件,则增加唯一字母数量uniqueCharsS。
- 当窗口内的唯一字母数量等于指定英文字母集合中的唯一字母数量时,记录当前窗口的长度和起始位置,并进入收缩窗口的过程。
- 收缩窗口过程中,移动窗口左边界,并更新相应的出现次数和唯一字母数量,直到唯一字母数量不满足条件为止。
- 返回最短名字序列。
本题解析所用的编程语言
上述解答方法采用的是JavaScript语言,通过函数来封装解题逻辑。
完整且正确的编程代码
function minWindow(s, t) {
let charCountT = {}; // 存储指定英文字母集合每个字母的出现次数
let charCountS = {}; // 存储当前名字序列每个字母的出现次数
let uniqueCharsT = 0; // 指定英文字母集合中的唯一字母数量
let uniqueCharsS = 0; // 当前名字序列中的唯一字母数量
let minLength = Number.MAX_SAFE_INTEGER; // 当前最小序列长度
let minWindowStart = -1; // 最小序列的起始位置
// 统计指定英文字母集合中每个字母的出现次数
for (let char of t) {
charCountT[char] = (charCountT[char] || 0) + 1;
if (charCountT[char] === 1) {
uniqueCharsT++;
}
}
let left = 0; // 窗口左边界
// 遍历名字序列,并统计每个窗口中的字母出现次数
for (let right = 0; right < s.length; right++) {
let rightChar = s[right];
charCountS[rightChar] = (charCountS[rightChar] || 0) + 1;
// 如果当前字母是指定英文字母,并且在窗口内的出现次数达到指定次数,则增加唯一字母数量uniqueCharsS
if (charCountT[rightChar] && charCountS[rightChar] === charCountT[rightChar]) {
uniqueCharsS++;
}
// 当窗口中的唯一字母数量等于指定英文字母集合中的唯一字母数量时,进入收缩窗口的过程
while (left <= right && uniqueCharsS === uniqueCharsT) {
let windowSize = right - left + 1;
// 更新最小序列长度和起始位置
if (windowSize < minLength) {
minLength = windowSize;
minWindowStart = left;
}
// 移动窗口左边界并更新相应的出现次数和唯一字母数量
let leftChar = s[left];
charCountS[leftChar]--;
if (charCountT[leftChar] && charCountS[leftChar] < charCountT[leftChar]) {
uniqueCharsS--;
}
left++;
}
}
// 若找不到满足条件的名字序列,则返回空字符串
if (minWindowStart === -1) {
return "";
}
// 返回最短名字序列
return s.substring(minWindowStart, minWindowStart + minLength);
}
题解 | 前端刷题 文章被收录于专栏
题目考察的知识点 题目解答方法的文字分析 本题解析所用的编程语言 完整且正确的编程代码