leetCode字符串的排列问题,滑动窗口解法

420 阅读1分钟

小知识,大挑战!本文正在参与“   程序员必备小知识   ”创作活动

本文同时参与 「掘力星计划」   ,赢取创作大礼包,挑战创作激励金

题目

在这里插入图片描述 在这里插入图片描述

java代码

class Solution {
    public boolean checkInclusion(String s1, String s2) {
        if(s1.length()>s2.length()){
            return false;
        }
        
        int[] arr1 = new int[26];
        int[] arr2 = new int[26];
        
        int len1 = s1.length();
        int len2 = s2.length();
        
        for(int i =0;i<len1;i++){
            arr1[s1.charAt(i)-'a']++;
            arr2[s2.charAt(i)-'a']++;
        }
        int cha=len2-len1;
        
        for(int i =0;i<cha;i++){
            if(Arrays.equals(arr1,arr2)){
                return true;
            }
            arr2[s2.charAt(i+len1)-'a']++;
            arr2[s2.charAt(i)-'a']--;
        }
        return Arrays.equals(arr1,arr2);
    }
}

这道题我也写了蛮久,自己的思路总是很局限打不开。看了别人的题解,搞懂了以后,自己又写了一遍。感觉成就感满满。感觉算法还是要重复练习,才能记忆深刻。

使用滑动窗口的方法, 总体思路就是,首先因为字符串输入的都是a-z的小写字母, 首先为两个字符串创建两个相对应的数组, 可以通过ascall码-a的差值存放每个字符串中字母的出现以及次数 先通过比较s2中最左端开始的s1.length的距离的arr1和arr2的值是否相等, 然后再把s2中剩下的值对应的字母存入arr2,同时要把数组arr2和s1中不相同的数值删除.