力扣热题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.找到字符串中所有字母异位词

给定两个字符串 sp,找到 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;
    }
};

你可能感兴趣的:(算法,leetcode,哈希算法,算法)