滑动窗口
class Solution {
public:
int minSubArrayLen(int s, vector& nums) {
//判断特殊情况
int l = 0;
int r = -1;
int sum = 0;
int res = nums.size() + 1;
while (l < nums.size())
{
if (r + 1 < nums.size() && sum < s)
sum += nums[++r];
else
sum -= nums[l++];
if (sum >= s)
res = min(res,r-l+1);
}
if (res == nums.size() + 1)
return 0;
return res;
}
};
class Solution {
public:
vector findAnagrams(string s, string p) {
if (s.empty())
return{};
vector res;
vector hash1(256,0), hash2(256,0); //用两个hash表来记录滑动窗口和p中出现的字符及其出现的次数,都初始化为0
//hash1是指p的hash表
//hash2是指滑动窗口的hash表
for (int i = 0; i < p.length(); i++)
{
hash1[p[i]]++;
hash2[s[i]]++;
}
if (hash1 == hash2) res.push_back(0);
//这个滑动窗口每次向前滑动一格
//尝试改进,如果遇到p中没有的直接跳到,该字符的下一个字符
for(int i=p.length();i
class Solution {
public:
string minWindow(string s, string t) {
//用一个hash表来记录t中的字符
unordered_map t_map;
for (auto ch : t) t_map[ch]++;
int min_len = s.size() + 1, min_begin = 0;
int count = 0;
int l = 0,r = 0;
for(;r= 0)
count++;
while (count == t.size())
//当t_map中的所有频率都为0时,已经找到了包含t的子串
{
if (r - l + 1 < min_len)
{
min_len = r - l + 1;
min_begin = l;
}
if (t_map.find(s[l])!= t_map.end())
if((++t_map[s[l]])> 0)
count--;
++l;
}
}
}
cout << min_len << endl;
if (min_len>s.size())
return "";
return s.substr(min_begin, min_len);
}
};