Description du titre
Étant donné deux chaînes s1 et s2, écrivez une fonction pour déterminer si s2 contient la permutation de s1.
En d'autres termes, l'une des permutations de la première chaîne est une sous-chaîne de la seconde chaîne.
Exemple 1:
输入: s1 = "ab" s2 = "eidbaooo"
输出: True
解释: s2 包含 s1 的排列之一 ("ba").
Exemple 2:
输入: s1= "ab" s2 = "eidboaoo"
输出: False
Sujets similaires
La plus longue sous-chaîne sans répétition
Trouver tous les mots dysphoriques de lettre dans la chaîne
Sous-chaîne de couverture minimale
Idées
这题我觉得就是 “ 找到字符串中所有字母异位词”和
“无重复最长子串” 的结合;
1.left和right分别为滑动窗口的左右边界,用target
数组记录目标字符串的每个字母的出现次数,用map数组
记录当前left~right中s2中每个字符出现的次数;
2.如果滑动窗口中出现了s1中没有出现过的字符或者出
现字符的次数比s1中的多的时候,就把这个字符踢掉,
换句话说就是缩小滑动窗口即l++。
3.当(l-r==s1.length())的时候,就是答案,因为滑动窗口已经把多余的字符或者没出现过的字符全部去除了;
Code:
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;
}
}