题目描述
给定两个字符串 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;
}
}