LeetCode:567. 字符串的排列

简介

题目链接:https://leetcode.cn/problems/permutation-in-string/description/

解决方式:字符串 + 滑动窗口(双指针)、哈希表

这是作者学习众多大神的思路进行解题的步骤,很推荐大家解题的时候去看看题解里面大佬们的思路、想法!

滑动窗口

思路:这题的思路与76.最小覆盖子串题目类似,都是使用滑动窗口然后通过哈希表或数组第三方数据结构判断滑动窗口的扩大、收缩时机。不一样的是,收缩条件变为滑动窗口的长度等于目标的长度。在这种情况下,valid 变量等于所需字符种类数,相当于固定长度(长度等于目标)的滑动窗口包含了所有目标字符种类且满足数量,该窗口字串就是目标的排列了。

哈希表

java 复制代码
class Solution {
    public boolean checkInclusion(String s1, String s2) {
        // 哈希表,需要的字符种类和数量
        HashMap<Character,Integer> need = new HashMap();
        for(char c : s1.toCharArray()){
            need.put(c, need.getOrDefault(c, 0) + 1);
        }
        // 哈希表,滑动窗口中存在的目标字符种类和数量
        HashMap<Character,Integer> window = new HashMap();
        // 滑动窗口是否满足目标种类数
        int valid = 0;
        // 双指针
        int left = 0;
        int right = 0;
        // 迭代
        while(right < s2.length()){ // 注意,right 是开区间,即左闭右开
            // 当前元素
            char c = s2.charAt(right);
            // 滑动窗口扩大
            right++;
            //当前元素判断
            if(need.containsKey(c)){
                // 当前元素是目标之一,存放进 window 中
                window.put(c, window.getOrDefault(c, 0) + 1);
                // 判断当前元素是否数量满足
                if(window.get(c).equals(need.get(c))){
                    // 满足,则 valid + 1,表明 window 中该字符种类数量满足目标
                    valid++;
                }
            }
            // 同步进行缩小判断
            while(right - left == s1.length()){
                // 左闭右开,right - left 即滑动窗口长度等于 s1
                // 长度相等时,判断是否是排列之一
                if(valid == need.size()){
                    // 长度相同,字符种类和数量又满足,说明是排列之一
                    return true;
                }
                // 否则不是排列,虽然长度相同但是有别的字符,需去除其他字符重新查找
                char cleft = s2.charAt(left);
                left++;
                // 判断是否是目标字符之一
                if(need.containsKey(cleft)){
                    // 是,则需判断移除该元素之前,数量是否等于目标数量,是则需修改valid
                    if(window.get(cleft).equals(need.get(cleft))){
                        // 因为移除后数量不满足了
                        valid--;
                    }
                    window.put(cleft, window.getOrDefault(cleft, 0) - 1);
                }
            }
        }
        // 迭代退出,说明没有结果
        return false;
    }
}
相关推荐
和裕4 小时前
全纸结构重型纸箱能否满足 1 吨以上设备出口熏蒸豁免要求?通关合规性全解析
大数据·运维·网络·人工智能·算法
tangguofeng5 小时前
不带头结点的链队操作集(不含InitFlag)(C语言版)
算法
苏打豆6 小时前
CRISP源码阅读——基于ROS2力矩反馈控制器与速度加速度零空间
c++·线性代数·算法·矩阵·机器人
蛋蛋的就会顺顺的6 小时前
hot100——矩阵
java·数据结构·算法·leetcode·力扣
老歌老听老掉牙7 小时前
麻花钻切屑形态演变的力学机制与临界条件分析
python·算法·钻头
zhangfeng11337 小时前
国产GPU/AI算力芯片现状(修订完整版 · 截至2026年9月
人工智能·算法·ai编程·npu
学代码的CJY7 小时前
从代码出发理解时间复杂度与空间复杂度
数据结构·算法
白帽攻防录8 小时前
SRC 挖洞:WSO2 JWT 算法混淆绕过深度复盘,CVE-2026-5430 不支持的算法怎么变成管理员
网络·算法·安全·网络安全·jwt
小O的算法实验室8 小时前
IEEE TEVC,基于精确与DQN群智能调度方法用于多目标异构USV
算法
可乐ea9 小时前
AI Agent 工具调用准确性评测:选择错误与参数错误分开测
大数据·人工智能·算法·大模型·工具调用·ai智能体·agent评测