leetcode567——字符串的排列

题目描述

找出字符串s1是不是s2中某一个子序列全排列中的一种;

滑动窗口

1、s1的全排列之后长度不变;

2、然后判断两个字符串中的字符个数是否相等,如果相等既就是全排列相等;

3、定义一个长度为n的固定窗口,并用两个长度26的int[]记录个数,第一个数组记录的是字符串s1中的每个字符的个数,第二个数组记录的是当前窗口内每个字符的个数;

4、左窗口缩小一步,右窗口随之增长一步,并不断变化当前窗口的字符个数;

5、遍历分为两段,第一段遍历长度为l1,最终如果两个数组相等,直接返回true;否则再从l1开始遍历到l2,每次窗口挪动一位,窗口长度不变;

点击查看代码
class Solution {
    public boolean checkInclusion(String s1, String s2) {
        int l1 = s1.length(), l2= s2.length();
        if (l2 < l1)
            return false;
        //因为都是小写字母,共有26种可能,因此用数组存储比用map存储方便
        int[] nums1 = new int[26]; //统计S1各个字符的个数
        int[] nums2 = new int[26]; //统计当前窗口各个字符的个数
        for (int i = 0; i < l1; i++) {
            nums1[s1.charAt(i)-'a']++;
            nums2[s2.charAt(i)-'a']++;
        }
        if (Arrays.equals(nums1,nums2))
            return true;
        for (int i = l1; i < l2; i++) {
            nums2[s2.charAt(i) - 'a']++;
            nums2[s2.charAt(i - l1) - 'a']--;
            if (Arrays.equals(nums1, nums2))
                return true;
        }
        return false;
    }
}
posted @ 2021-10-13 14:40  精神小土豆  阅读(37)  评论(0)    收藏  举报