大家好,我是开车的阿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来记录字符出现次数,并对每个字符进行了哈希映射。同时,还使用了两个指针leftright来表示滑动窗口的边界,并不断更新最小子串的起始位置和长度,直到找到符合条件的最小子串。

您的关注、点赞、收藏就是我创作的动力,三连支持阿Q!