ADPR国际传媒网站建设,互联网营销师证,asp.net 获取网站域名,安全舆情监测平台最小覆盖串 题解1 滑窗双指针模板#xff08;labuladong#xff0c;高效好套#xff0c;length版#xff09; 给你一个字符串
s 、一个字符串
t 。返回
s 中涵盖
t 所有字符的最小子串。如果
s 中不存在涵盖
t 所有字符的子串#xff0c;则返回空字符串
labuladong高效好套length版 给你一个字符串
s 、一个字符串
t 。返回
s 中涵盖
t 所有字符的最小子串。如果
s 中不存在涵盖
t 所有字符的子串则返回空字符串 。 注意
对于 t 中重复字符我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。 如果 s 中存在这样的子串我们保证它是唯一的答案。 示例 1
输入s ADOBECODEBANC, t ABC
输出BANC
解释最小覆盖子串 BANC 包含来自字符串 t 的 A、B 和 C。示例 2
输入s a, t a
输出a
解释整个字符串 s 是最小覆盖子串。示例 3:
输入: s a, t aa
输出:
解释: t 中两个字符 a 均应包含在 s 的子串中
因此没有符合条件的子字符串返回空字符串。提示
m s.length n t.length1 m, n 105s 和 t 由英文字母组成
进阶你能设计一个在 o(mn) 时间内解决此问题的算法吗
题解1 滑窗双指针模板labuladong高效好套length版
class Solution {
public:
/* 模板代表题目特点
1. 指针 left, right 不会回退它们的值只增不减
2. 字符串/数组中的每个元素都只会进入窗口一次然后被移出窗口一次
*/string minWindow(string s, string t) {const int sl s.size();const int tl t.size();if(sl tl) return string();unordered_mapchar, int pattern, res;for(auto x : t) pattern[x];int left(0), right(0), valid(0), start(0);int len INT_MAX;while(right sl){char tmp s[right];right;if(pattern.count(tmp)){res[tmp] ;if(res[tmp] pattern[tmp])valid ;}while(valid pattern.size()){if(right - left len) {len right - left;start left;}tmp s[left];left ;if(pattern.count(tmp)){// 因为是覆盖串所以t只需要是当前合法串的子集// res[tmp] 是可能大于pattern里的值的为了每个字符都满足一直往后找// 只有数值不同了 valid才变化if(res[tmp] pattern[tmp])valid --;res[tmp] --;}}}return len INT_MAX ? : s.substr(start, len);}
};