567. 字符串的排列

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

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

示例 1:

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

输入:s1= "ab" s2 = "eidboaoo"
输出:false

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutation-in-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路及方法

之前想的方法复杂且有错,所以还是看了官方解答,学会了滑窗。

设置窗口,一个是s1,一个是s2.,窗口的大小就是s1的长度。s1Arr和s2Arr记录的是当前窗口s1和s2出现字符的次数,s1Arr是不变的,s2Arr是可变的。

初始先判断两个窗口是否相等,相等就意味着包含s1的排列,返回true。否则从windowSize开始遍历,即相当于将s2的窗口向右边挪了一位,所以刚挪进来的那位字符出现次数++,挪出去的字符出现次数--,每遍历一次对比一次,相等返回true,一直到遍历结束,返回false。

class Solution {
    public boolean checkInclusion(String s1, String s2) {
        if (s1.length() > s2.length()) return false;

        int[] s1Arr = new int[26];
        int[] s2Arr = new int[26];

        // 设置窗口及窗口大小
        int windowSize = s1.length();
        for (int i = 0; i < windowSize; i++) {
            s1Arr[s1.charAt(i) - 'a']++;
            s2Arr[s2.charAt(i) - 'a']++;
        }
        // 如果初始相等
        if (Arrays.equals(s1Arr, s2Arr)) return true;
        
        // 滑窗
        for (int i = windowSize; i < s2.length(); i++) {
            s2Arr[s2.charAt(i) - 'a']++;
            s2Arr[s2.charAt(i - windowSize) - 'a']--;
            // 如果窗口相等
            if (Arrays.equals(s1Arr, s2Arr)) return true;
        }

        return false;
    }
}

结果如下:

你可能感兴趣的:(567. 字符串的排列)