567. 字符串的排列

136 阅读1分钟

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

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

在这里插入图片描述

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

--

滑动窗口

在这里插入图片描述


我举得跟双指针差不多,试一下双指针。

class Solution {
    public boolean checkInclusion(String s1, String s2) {
        //处理s1,放到hashMap中。
        int[] list1 = new int[26];
        int[] list2 = new int[26];

        if (s1.length() > s2.length()) {
            return false;
        }

        for (int i = 0; i < s1.length(); ++i) {
            list1[s1.charAt(i) - 97]++;
            list2[s2.charAt(i) - 97]++;
        }

        if (Arrays.equals(list1, list2)) {
            return true;
        }


        for (int i = s1.length(); i < s2.length(); ++i) {
            ++list2[s2.charAt(i)-97];
            --list2[s2.charAt(i-s1.length())-97];
            if (Arrays.equals(list1, list2)) {
                return true;
            }
        }

        return false;
    }
}

上面方法改进,不用Arrays.equals

直接计算数组Ascll之和,及其数组中数据个数 这是一位野生大佬的思路,膜拜

leetcode-cn.com/problems/pe…

leetcode-cn.com/problems/pe…

在这里插入图片描述

class Solution {
    public boolean checkInclusion(String s1, String s2) {
        if(s1.length() > s2.length())
            return false;
        //left,right表示整个窗口的范围
        int sum = 0,count = 0,left = 0,right = s1.length()-1;
        char[] chars = s1.toCharArray();
        char[] chars1 = s2.toCharArray();
        //统计s1的字符个数
        int counts[] = new int[26];
        for(int i = left;i <= right;i++){
            sum += chars[i];
            counts[chars[i] - 'a']++;
            count += chars1[i];
        }
        if(sum == count) {
            int counts1[] = new int[26];
            for (int i = left; i <= right; i++)
                counts1[chars1[i] - 'a']++;
            //比较两个数组是否相等,如果相等则返回true
            if (Arrays.equals(counts,counts1))
                return true;
        }
        //滑动窗口并重复上述的操作
        while(right < s2.length() - 1){
            if(right+1 < s2.length()){
                count = count - s2.charAt(left++) + s2.charAt(++right);
                if(sum == count) {
                    int counts1[] = new int[26];
                    for (int i = left; i <= right; i++)
                        counts1[chars1[i] - 'a']++;
                    if (Arrays.equals(counts,counts1))
                        return true;
                }
            }
        }
        return false;
    }
}