算法-滑动窗口

目录

无重复字符的最长子串

关键是想到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;
        }
    }
}
相关推荐
方方洛7 分钟前
vllm教程-00-前言与导读
人工智能·算法·vllm
IT毕设实战小研24 分钟前
电影数据可视化推荐系统
大数据·后端·爬虫·python·算法·信息可视化·课程设计
且随疾风前行.28 分钟前
从驱动来分析服务的添加过程
算法
CoderYanger1 小时前
A.每日一题:输入单词需要的最少按键次数 Ⅰ+Ⅱ
java·数据结构·算法·leetcode·面试
xiaokcehui2 小时前
地球物理大地测量学计算系列之十七局部重力场SRBF逼近及其性能指标测评
人工智能·算法·机器学习
Navigator_Z2 小时前
LeetCode //C - 1221. Split a String in Balanced Strings
c语言·算法·leetcode
天疆说3 小时前
庞特里亚金极小值原理的详细推导
算法
余俊晖3 小时前
Self-OPD:去掉教师机的流匹配模型 On-Policy 蒸馏
人工智能·算法·机器学习
手写码匠3 小时前
华为云Flexus+DeepSeek征文|华为云MaaS DeepSeek推理服务 × Flexus云服务器 × Dify一键部署:性能评测实战
人工智能·深度学习·算法·aigc
啥都想学点的研究生4 小时前
一篇文章讲清楚:逻辑回归
算法·机器学习·逻辑回归