美文网首页
567. 字符串的排列

567. 字符串的排列

作者: Abeants | 来源:发表于2021-10-26 23:44 被阅读0次

给你两个字符串 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;
    }
}

结果如下:

相关文章

  • 2021.2.10每日一题

    567. 字符串的排列[https://leetcode-cn.com/problems/permutation-...

  • 567. 字符串的排列

    567. 字符串的排列 问题 给定两个字符串 和 ,写一个函数来判断 是否包含 的排列。换句话说,第一个字符串...

  • 567. 字符串的排列

    给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。 换句话说,第一个字符串的排列之一...

  • 567. 字符串的排列

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

  • 567. 字符串的排列(Python)

    题目 难度:★★★☆☆类型:字符串方法:滑动窗口 力扣链接请移步本题传送门[https://leetcode-cn...

  • 【LeetCode】567. 字符串的排列(滑动窗口)

    简书内代码已上传GitHub:点击我 去GitHub查看代码这道题和 最小覆盖子串 思路基本一样 题目: 给定两个...

  • 迭代算法

    问题 输入一个字符串,给出该字符串所有的排列 问题分析 非常标准的排列问题,不考虑字符串重复的前提下共有n!种排列...

  • LeetCode - 0006 - ZigZag Convers

    题目概要 将字符串按照ZigZag的顺序重新排列,求排列之后的新字符串。 题目链接 ZigZag Conversi...

  • 38:字符串的排列

    题目38:字符串的排列 输入一个字符串,打印出该字符串中字符的所有排列。 举例说明 例如输入字符串abc。则打印出...

  • 字符串的全排列

    字符串的全排列 题目描述: 输入一个字符串,打印出该字符串中字符的所有排列。 例如输入字符串abc,则输出由字符a...

网友评论

      本文标题:567. 字符串的排列

      本文链接:https://www.haomeiwen.com/subject/lbrualtx.html