给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。
换句话说,s1 的排列之一是 s2 的 子串 。
class Solution {
public boolean checkInclusion(String s1, String s2) {
int n = s1.length(),m = s2.length();
if(n > m){
return false;
}
char[] arr1 = s1.toCharArray();
char[] arr2 = s2.toCharArray();
//统计s1的词频
int[] charCount = new int[26];
for(char c : arr1){
charCount[c - 'a']++;
}
int left = 0,right = 0;
//固定左端点,只需尝试[0,m-n]
while(left <= (m-n)){
//没有达到字符串1的最大长度,并且charCount中有arr2在right位置的值
while(right < left + n && charCount[arr2[right] - 'a'] >= 1){
charCount[arr2[right] - 'a']--;
right++;
}
if(right == left + n)
return true;
//移除最左边的端点加入charCount
charCount[arr2[left] - 'a']++;
left++;
}
return false;
}
}