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