算法-滑动窗口

目录

无重复字符的最长子串

关键是想到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;
        }
    }
}
相关推荐
那个村的李富贵21 小时前
CANN加速下的AIGC“即时翻译”:AI语音克隆与实时变声实战
人工智能·算法·aigc·cann
power 雀儿21 小时前
Scaled Dot-Product Attention 分数计算 C++
算法
琹箐21 小时前
最大堆和最小堆 实现思路
java·开发语言·算法
renhongxia11 天前
如何基于知识图谱进行故障原因、事故原因推理,需要用到哪些算法
人工智能·深度学习·算法·机器学习·自然语言处理·transformer·知识图谱
坚持就完事了1 天前
数据结构之树(Java实现)
java·算法
算法备案代理1 天前
大模型备案与算法备案,企业该如何选择?
人工智能·算法·大模型·算法备案
赛姐在努力.1 天前
【拓扑排序】-- 算法原理讲解,及实现拓扑排序,附赠热门例题
java·算法·图论
野犬寒鸦1 天前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
霖霖总总1 天前
[小技巧66]当自增主键耗尽:MySQL 主键溢出问题深度解析与雪花算法替代方案
mysql·算法
rainbow68891 天前
深入解析C++STL:map与set底层奥秘
java·数据结构·算法