大家好,我是开车的阿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!