leetcode(hot100)8、9

发布于:2025-02-10 ⋅ 阅读:(40) ⋅ 点赞:(0)

解题思路:看到重复用哈希表 本题用哈希表和滑动窗口滑动窗口用两个指针表示, 哈希表用来存储无重复的值,如果遍历哈希表找到了则说明这是重复的 需要移动这个窗口 滑动窗口向右移(用while循环),然后插入这个值,最终取最大的长度。

当右指针 right 遍历字符串时,检查当前字符 s[right] 是否已经在窗口中。然后在分为两种情况来考虑。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int sum = 0,left = 0;
        unordered_set<char> window;
        for(int right = 0; right < s.size();right++){
            while(window.find(s[right]) != window.end()){
                window.erase(s[left]);
                left++;
            }
            window.insert(s[right]);
            sum = max(sum,right-left+1);            
        }
        return sum;
    }
};

解题思路:

用滑动窗口来解决 然后返回滑动窗口左指针。首先遍历p的所有字母,保存在一个数组中(下标表示字母,值表示字母出现的次数),然后处理s的数组,判断左指针是否小于0 即确定窗口大小是否符合标准标准了,符合标准之后就是比较两个数组是否相等 相等就是放入结果中。(这里面要处理s数组中的值 当left走了就要减减)。

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int>result;
        vector<int>conts(26);
        vector<int>contp(26);
        for(char c:p){
            contp[c-'a']++;
        }
        for(int right = 0; right < s.size();right++){
            conts[s[right]-'a']++;//右端字母进入窗口
            int left = right - p.size() + 1;
            if(left<0)continue;//窗口长度不足 即只有刚开始时有
            if(conts == contp){//s和p相等
                result.push_back(left);//左端下标加入答案
            }
            conts[s[left]-'a']--;//左端字母离开窗口
        }
        return result;
    }
};


网站公告

今日签到

点亮在社区的每一天
去签到