力扣热题100道-滑动窗口篇
滑动窗口
3.无重复字符的最长字串
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
/*
思路:滑动窗口
用一个哈希表,i,j作为滑动窗口,当hash[i]==2时候,j++,直到去除重复的为止
*/
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char,int>hash;
int res=0;
for(int i=0,j=0;i<s.size();i++){
hash[s[i]]++;
while(hash[s[i]]>1) hash[s[j++]]--;
res = max(res,i-j+1);
}
return res;
}
};
438.找到字符串中所有字母异位词
给定两个字符串 s
和 p
,找到 s
中所有 p
的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
示例 1:
输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
示例 2:
输入: s = "abab", p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。
//采用一个滑动窗口
// i,j i为起始位置,j为终止位置,当i加一个位置,hash[s[i]]--.同时hash[s[j]]++,判断此时的哈希表是否相等即可
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
unordered_map<char,int> hs;
unordered_map<char,int> hp;
int slen = s.size(),plen=p.size();
if(slen < plen) return {};
for(int i=0;i<plen;i++){
hs[s[i]]++; hp[p[i]]++;
}
vector<int> res;
if(hs == hp) res.push_back(0);
for(int i=0;i+plen<slen;i++){
if(--hs[s[i]] == 0) hs.erase(s[i]);
hs[s[i+plen]]++;
if(hs == hp) res.push_back(i+1);
}
return res;
}
};