大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点
本题主要考察滑动窗口算法的应用,通过滑动窗口找到涵盖t的所有字符的最小子串。
题目解答方法的文字分析
我们可以使用滑动窗口算法来解决这个问题。首先,我们使用一个哈希表来记录字符串t中每个字符出现的次数。然后,我们使用两个指针left和right表示滑动窗口的左边界和右边界,初始时两个指针都指向s的开头。我们将右指针right向右移动,直到涵盖了字符串t中的所有字符。然后,我们再将左指针left向右移动,缩小窗口的大小,直到不能涵盖所有字符为止。在每次右指针right移动的过程中,我们更新最小子串的起始位置和长度。重复这个过程直到右指针到达字符串s的末尾。
本题解析所用的编程语言 (C++)
C++
完整且正确的编程代码
#include <string>
#include <unordered_map>
using namespace std;
class Solution {
public:
string minWindow(string s, string t) {
unordered_map<char, int> charCount; // 用于记录t中每个字符的出现次数
int requiredChars = t.length(); // 需要的不同字符总数
int minStart = 0; // 最小子串的起始位置
int minLen = INT_MAX; // 最小子串的长度
// 统计t中每个字符的出现次数
for (char ch : t) {
charCount[ch]++;
}
int left = 0, right = 0;
while (right < s.length()) {
// 如果当前字符在t中出现次数不为0,说明找到了一个t中的字符
if (charCount[s[right]] > 0) {
requiredChars--;
}
charCount[s[right]]--; // 在窗口内,对应字符出现次数减1
right++; // 右指针右移,扩大窗口
while (requiredChars == 0) {
// 当窗口内包含了t中所有字符时,尝试缩小窗口
if (right - left < minLen) {
minStart = left; // 更新最小子串的起始位置
minLen = right - left; // 更新最小子串的长度
}
// 如果左指针指向的字符在t中出现次数大于等于0,说明该字符在窗口内,窗口缩小后会失去该字符
if (charCount[s[left]] >= 0) {
requiredChars++; // 在窗口外,需要的不同字符总数增加
}
charCount[s[left]]++; // 左指针右移,窗口缩小,对应字符出现次数加1
left++;
}
}
return minLen == INT_MAX ? "" : s.substr(minStart, minLen);
}
};
注意:以上代码中使用了unordered_map来记录字符出现次数,并对每个字符进行了哈希映射。同时,还使用了两个指针left和right来表示滑动窗口的边界,并不断更新最小子串的起始位置和长度,直到找到符合条件的最小子串。
您的关注、点赞、收藏就是我创作的动力,三连支持阿Q!

京公网安备 11010502036488号