算法-滑动窗口

目录

无重复字符的最长子串

关键是想到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;
        }
    }
}
相关推荐
码云数智-大飞4 分钟前
分布式锁的“双雄对决”:Redis 与 ZooKeeper 的深度博弈与选型指南
算法
cpp_250111 分钟前
P1910 L 国的战斗之间谍
数据结构·c++·算法·题解·洛谷·背包dp
yu859395813 分钟前
时延估计的互相关算法(MATLAB实现)
开发语言·算法·matlab
逸风尊者15 分钟前
2026 主流 Claw 类产品技术报告
人工智能·后端·算法
强盛机器学习~20 分钟前
考虑异常天气和太阳辐射下基于强化学习的无人机三维路径规划
算法·matlab·无人机·强化学习·路径规划·无人机路径规划·q-learning
Pixlout24 分钟前
《7元接口体系》v1.0
网络·算法·硬件工程
SUNNY_SHUN24 分钟前
不需要Memory Bank:CMDR-IAD用2D+3D双分支重建做工业异常检测,MVTec 3D 97.3%
论文阅读·人工智能·算法·3d
Matlab光学29 分钟前
Matlab 复现:分数阶&整数阶OAM 变换
算法·matlab·拓扑学
凌波粒1 小时前
LeetCode--459.重复的子字符串(字符串/KMP算法)
算法·leetcode·职场和发展
_深海凉_1 小时前
LeetCode热题100-移除元素
数据结构·算法·leetcode