「力扣」第 567 题:字符串的排列


「力扣」第 567 题:字符串的排列

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

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

示例1:

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

示例2:

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

注意:

  1. 输入的字符串只包含小写字母
  2. 两个字符串的长度都在 [1, 10,000] 之间

Java 代码:

import java.util.Arrays;

public class Solution {

    public boolean checkInclusion(String s1, String s2) {
        int sLen1 = s1.length();
        int sLen2 = s2.length();

        char[] charArray1 = s1.toCharArray();
        int[] cnt1 = new int[128];
        int[] cnt2 = new int[128];

        int distance = 0;
        for (char c : charArray1) {
            if (cnt1[c] == 0) {
                distance++;
            }
            cnt1[c]++;
        }

        int left = 0;
        int right = 0;
        int count = 0;
        char[] charArray2 = s2.toCharArray();

        while (right < sLen2) {
            // 两个 continue 都可以不要
            if (cnt1[charArray2[right]] == 0) {
                right++;
                continue;
            }

            cnt2[charArray2[right]]++;
            if (cnt2[charArray2[right]] == cnt1[charArray2[right]]) {
                count++;
            }

            right++;
            while (count == distance) {
                if (right - left == sLen1){
                    return true;
                }

                if (cnt1[charArray2[left]] == 0) {
                    left++;
                    continue;
                }

                cnt2[charArray2[left]]--;
                if (cnt2[charArray2[left]] < cnt1[charArray2[left]]) {
                    count--;
                }
                left++;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        String s1 = "ab";
        String s2 = "eidbaooo";
        Solution solution = new Solution();
        boolean res = solution.checkInclusion(s1, s2);
        System.out.println(res);
    }
}

(本节完)


文章作者: liweiwei1419
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 liweiwei1419 !
评论
 上一篇
专题 5:双指针 专题 5:双指针
专题 5:双指针典型问题: 「力扣」第 42 题:接雨水 题解:暴力解法、优化、双指针、单调栈
下一篇 
「力扣」第 438 题:找到字符串中所有字母异位词 「力扣」第 438 题:找到字符串中所有字母异位词
「力扣」第 438 题:找到字符串中所有字母异位词 中文网址:438. 找到字符串中所有字母异位词 ; 英文网址:438. Find All Anagrams in a String 。 给定一个字符串 s 和一个非空字符串 p,找到
  目录