考察的知识点:哈希;

解答方法分析:

  1. 首先,初始化变量 count 为字符串 t 的长度,表示需要匹配的字符数量。
  2. 创建一个哈希表 map,用于记录字符串 t 中每个字符的出现次数。
  3. 使用双指针 left 和 right 分别指向字符串 s 的起始位置。
  4. 初始化结果字符串 result 为空字符串,string_len 为最大整数值,用于记录最小窗口的长度。
  5. 进入主循环,判断右指针是否越界:若没有越界,检查指针 right 所指向的字符是否在哈希表中:若在哈希表中,将该字符的出现次数减1,并判断是否大于等于0。若是,则表示匹配到了一个需要的字符,将计数器 count 减1。右指针向右移动一位。进入内循环,判断计数器 count 是否为0:若为0,说明窗口包含了字符串 t 中的所有字符。检查左指针所指向的字符是否在哈希表中:若存在,将该字符的出现次数加1,并判断是否大于0。若是,则表示窗口中除了一个需要的字符,将计数器 `count 加1。左指针向右移动一位。更新窗口长度,若当前窗口长度小于记录的最小长度 string_len,则更新 string_len 和 result。
  6. 返回窗口长度是否为最大整数值,若是,则返回空字符串 "",否则返回最小窗口字符串 result

ai.hxkj.vip

AI如风,常伴吾身

所用编程语言:C++;

完整编程代码:↓

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @param t string字符串
     * @return string字符串
     */
    string minWindow(string s, string t) {
        int count = t.length();
        unordered_map<char, int> map;
        for (char c : t) {
            map[c]++;
        }
        int left = 0;
        int right = 0;
        string result = "";
        int string_len = INT_MAX;
        while (right < s.length()) {
            if (map.find(s[right]) != map.end()) {
                map[s[right]]--;
                if (map[s[right]] >= 0) {
                    count--;
                }
            }
            right++;
            while (count == 0) {
                if (map.find(s[left]) != map.end()) {
                    map[s[left]]++;
                    if (map[s[left]] > 0) {
                        count++;
                        if (right - left < string_len) {
                            string_len = right - left;
                            result = s.substr(left, string_len);
                        }
                    }
                }
                left++;
            }
        }
        return string_len == INT_MAX ? "" : result;
    }
};