567. 字符串的排列

Posted yangbocsu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了567. 字符串的排列相关的知识,希望对你有一定的参考价值。

567. 字符串的排列

一、题目

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

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

二、参考代码

注意:

JavaMap记录字母出现个数的写法,
最后一个测试用例通不过时,要明白一件事。
Integer是对象啊。。。
Integer会缓存频繁使用的数值,
数值范围为-128127,在此范围内直接返回缓存值。
超过该范围就会new 一个对象。
class Solution 
    public boolean checkInclusion(String s1, String s2) 
        HashMap<Character,Integer> need = new HashMap<>();
        HashMap<Character,Integer> window = new HashMap<>();
        for (Character item : s1.toCharArray())
            need.put(item,need.getOrDefault(item,0)+1);
        
        int left = 0, right = 0;
        int valid = 0;
        boolean flag = false;

        while (right < s2.length())
            char ch = s2.charAt(right);
            // 进行窗口内数据的一系列更新
            if (need.containsKey(ch))
                window.put(ch,window.getOrDefault(ch,0)+1);
                if (window.get(ch).intValue() == need.get(ch).intValue())
                    valid++;
                
            
            // 扩大窗口
            right ++;

            // 判断左侧窗口是否要收缩
            while (right - left >= s1.length())
                // 在这里判断是否找到了合法的子串
                if (valid == need.size())
                    flag =  true;
                    break;
                
                char d = s2.charAt(left);
                //  进行窗口内数据的一系列更新
                if (need.containsKey(d))
                    if (window.get(d).intValue() == need.get(d).intValue())
                        valid --;
                    
                    window.put(d,window.getOrDefault(d,0)-1);
                
                // 缩小窗口
                left ++;
            
        
        
        return flag;
    

以上是关于567. 字符串的排列的主要内容,如果未能解决你的问题,请参考以下文章

567. 字符串的排列

LeetCode——567. 字符串的排列

Leetcode 567.字符串的排列

leetcode 567. 字符串的排列

文巾解题 567. 字符串的排列

Leetcode刷题100天—567. 字符串的排列(滑动窗口)—day22