LeetCode 567. Permutation in String

LeetCode 567. Permutation in String (字符串的排列)

题目

链接

https://leetcode-cn.com/problems/permutation-in-string/

问题描述

给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。

换句话说,s1 的排列之一是 s2 的 子串 。

示例

输入:s1 = "ab" s2 = "eidbaooo"
输出:true
解释:s2 包含 s1 的排列之一 ("ba").

提示

1 <= s1.length, s2.length <= 104
s1 和 s2 仅包含小写字母

思路

还是滑动窗口,要求排序,那就用need存放应该有的字符和数量。从右侧进行增加,左侧进行减少。由于要包括排列,就代表子串的长度应该和s1一样长,可以减少部分运算。

复杂度分析

时间复杂度 O(n)
空间复杂度 O(n)

代码

Java

public static boolean checkInclusion(String s1, String s2) {
        Map<Character, Integer> window = new HashMap();
        Map<Character, Integer> need = new HashMap();
        int s1len = s1.length();
        int s2len = s2.length();
        for (int i = 0; i < s1len; i++) {
            char c = s1.charAt(i);
            need.put(c, need.getOrDefault(c, 0) + 1);
        }
        int left = 0, right = 0;
        int valid = 0;
        while (right < s2len) {
            char addch = s2.charAt(right);
            window.put(addch, window.getOrDefault(addch, 0) + 1);
            right++;
            if (need.containsKey(addch) && window.get(addch).equals(need.get(addch))) {
                valid++;
                if (valid == need.size()) {
                    return true;
                }
            }
            while (right - left >= s1len) {
                char rech = s2.charAt(left);
                left++;
                if (need.containsKey(rech)) {

                    if (window.get(rech).equals(need.get(rech))) {
                        valid--;
                    }window.put(rech, window.get(rech) - 1);
                }
            }
        }
        return false;
    }

posted @   cheng102e  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示