【滑动窗口法】—— 567. 字符串的排列
发布日期:2021-05-07 21:20:29 浏览次数:21 分类:精选文章

本文共 945 字,大约阅读时间需要 3 分钟。

题目描述

给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。

换句话说,第一个字符串的排列之一是第二个字符串的子串。

示例 1:

输入: s1 = “ab” s2 = “eidbaooo”

输出: True
解释: s2 包含 s1 的排列之一 (“ba”).
示例 2:

输入: s1= “ab” s2 = “eidboaoo”

输出: False

解题思路

class Solution_567 {       public boolean checkInclusion(String s1, String s2) {           int n = s1.length(), m = s2.length();        if (n > m) {               return false;        }        int[] cnt1 = new int[26];        int[] cnt2 = new int[26];        for (int i = 0; i < n; ++i) {               ++cnt1[s1.charAt(i) - 'a'];            ++cnt2[s2.charAt(i) - 'a'];        }        //两个字符串完全相等        if (Arrays.equals(cnt1, cnt2)) {               return true;        }        for (int i = n; i < m; ++i) {               //滑动窗口,保持窗口的大小始终是2            ++cnt2[s2.charAt(i) - 'a'];            --cnt2[s2.charAt(i - n) - 'a'];            if (Arrays.equals(cnt1, cnt2)) {                   return true;            }        }        return false;    }}
上一篇:【动态规划】—— 300. 最长递增子序列
下一篇:【滑动窗口法】—— 438. 找到字符串中所有字母异位词

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2025年03月21日 17时20分39秒