LeetCode 字符串的排列 Java 滑动窗口 双指针

题目描述

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

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

示例1:

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

示例2:

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

相似题目

无重复最长子串

找到字符串中所有字母异位词

最小覆盖子串

日志统计

思路

这题我觉得就是 “ 找到字符串中所有字母异位词”和
“无重复最长子串” 的结合;
1.left和right分别为滑动窗口的左右边界,用target
数组记录目标字符串的每个字母的出现次数,用map数组
记录当前left~right中s2中每个字符出现的次数;

2.如果滑动窗口中出现了s1中没有出现过的字符或者出
现字符的次数比s1中的多的时候,就把这个字符踢掉,
换句话说就是缩小滑动窗口即l++3.当(l-r==s1.length())的时候,就是答案,因为滑动窗口已经把多余的字符或者没出现过的字符全部去除了;

代码:

class Solution {
    
    
    public boolean checkInclusion(String s1, String s2) {
    
    
        int length1=s1.length();
        int length2=s2.length();
        if(length1>length2)return false;
        char arr1[]=s1.toCharArray();
        char arr2[]=s2.toCharArray();
        int target[]=new int[128];
        int map[]=new int[128];
        int l=0;
        int r=0;
        for(int i=0;i<length1;i++){
    
    
            target[arr1[i]]++;
            }
        while(r<length2){
    
    
            char temp1=arr2[r];
            r++;
            map[temp1]++;
            while(map[temp1]>target[temp1]){
    
    
                char temp2=arr2[l];
                map[temp2]--;
                l++;
            }
            if(r-l==length1)
            return true;
        }
        return false;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_44844588/article/details/108157026