算法-滑动窗口

目录

无重复字符的最长子串

关键是想到ASCII码128的char数组来记录元素,每次右指针重复且重复位置位于左右指针之间时将左指针指向重复位置。

java 复制代码
public class 无重复字符的最长子串 {
    class Solution {
        public int lengthOfLongestSubstring(String s) {
            int res = 0;
            int[] index = new int[128];
            Arrays.fill(index, -1);

            char[] chars = s.toCharArray();
            int l = 0;
            for (int r = 0; r < chars.length; r++) {
                if (index[chars[r]]>=l){
                    res = Math.max(res, r-l);
                    l = index[chars[r]]+1;
                }
                index[chars[r]] = r;
            }
            return Math.max(res, s.length()-l);
        }
    }
}

找到字符串中所有字母异位词

队列 恢复现场,不过要注意元素已足够和元素不需要的情况在出队后要分别操作

java 复制代码
public class 找到字符串中所有字母异位词 {
    class Solution {
        public List<Integer> findAnagrams(String s, String p) {
            ArrayList<Integer> res = new ArrayList<>();
            int[] P = new int[26];
            for (char c : p.toCharArray()) P[c - 'a']++;

            int l = 0;
            char[] chars = s.toCharArray();
            ArrayDeque<Character> queue = new ArrayDeque<>();
            for (int i = 0; i < chars.length; i++) {
                // chars[i]在窗口中仍然不够
                if (P[chars[i]-'a']>0){
                    queue.offerLast(chars[i]);
                    P[chars[i]-'a']--;
                }
                // chars[i]在窗口中已经足够了
                else{
                    char first;
                    // 出队直到窗口出去一个和chars[i]相同的元素
                    while (!queue.isEmpty()) {
                        first = queue.pollFirst();
                        l++;
                        P[first - 'a']++;
                        if (first== chars[i]) break;
                    };
                    // 然后将当前元素放进去
                    if (P[chars[i]-'a']>0){
                        queue.offerLast(chars[i]);
                        P[chars[i]-'a']--;
                    }else{
                        l++;
                    }
                }
                if (queue.size()==p.length()) res.add(l);
            }
            return res;
        }
    }
}
相关推荐
饼饼学习空间智能34 分钟前
遥操作数据能否提升机器人自主化水平?详解模仿学习、仿真放大与Sim2Real闭环
人工智能·算法
间歇性努力持续性发呆的野生快乐选手1 小时前
dfs回溯,bfs枚举,完全背包
c++·算法·深度优先·宽度优先
郝学胜_神的一滴1 小时前
干货版《算法导论》17:双数极值配对与卡牌手牌编码最优解
数据结构·算法
nike0good2 小时前
Codeforces Round 1101 (Div. 2) 题解
算法
中年阿甘2 小时前
解析式布局-二次线长布局
线性代数·算法·矩阵
程序喵大人2 小时前
【C++进阶】STL算法与函数对象 -【C++进阶】STL算法与函数对象
开发语言·c++·算法
星轨初途3 小时前
LeetCode 热题 100——day6 三数之和
数据结构·c++·算法·leetcode·职场和发展
鹿角片ljp3 小时前
LeetCode 53. 最大子数组和
算法·leetcode·职场和发展
江屿风4 小时前
【科普】【差集&交集概念落地云相册】流食般投喂
开发语言·c++·笔记·算法·云相册
数模竞赛Paid answer4 小时前
2023年五一杯数学建模A题无人机定点投放问题求解全过程完整文档及程序
算法·数学建模·无人机·五一杯