算法-滑动窗口

目录

无重复字符的最长子串

关键是想到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;
        }
    }
}
相关推荐
smj2302_796826528 小时前
解决leetcode第3943题递增后的数对数量
数据结构·python·算法·leetcode
炽烈小老头9 小时前
【每天学习一点算法 2026/05/25】矩阵中的最长递增路径
学习·算法·矩阵
叁散9 小时前
实验报告:5G 仿真环境与基本链路模拟
算法
从负无穷开始的三次元代码生活10 小时前
算法零碎灵感点分享
算法
染指111010 小时前
9.LangChain框架(实现RAG)
数据库·人工智能·算法·机器学习·ai·大模型
大数据三康10 小时前
在spyder进行的遗传算法练习
开发语言·python·算法
Gene_202210 小时前
轮式底盘的微分平坦
算法
吴佳浩11 小时前
现代多模态大模型的核心基础:Unified Self-Attention
人工智能·算法·llm
小小编程路12 小时前
C++ 常用逻辑运算符
开发语言·c++·算法
Hali_Botebie12 小时前
两种子词分词算法BPE (Byte-Pair Encoding) 和Unigram 区别
人工智能·算法