LeetCode链接:
题目:
给定两个字符串 s1
和 s2
,写一个函数来判断 s2
是否包含 s1
的某个变位词。
换句话说,第一个字符串的排列之一是第二个字符串的 子串 。
示例:
输入: s1 = "ab" s2 = "eidbaooo"
输出: True
解释: s2 包含 s1 的排列之一 ("ba").
代码:
class Solution {
public boolean checkInclusion(String s1, String s2) {
//只有当两个字符串每个字符的个数均相等时,一个字符串才是另一个字符串的变位词。
//只要保证字符个数相等就行
int n = s1.length(), m = s2.length();
if(n > m){
return false;
}
int[] cnt1 = new int[26]; //26个字母
int[] cnt2 = new int[26];
for(int i = 0; i < n; ++i){
++cnt1[s1.charAt(i) - 'a'];
++cnt2[s2.charAt(i) - 'a'];
}
if(Arrays.equals(cnt1, cnt2)){
return true;
}
for(int i = n; i < m; ++i){
//滑窗,同时往后移
++cnt2[s2.charAt(i) - 'a'];
--cnt2[s2.charAt(i - n) - 'a'];
if(Arrays.equals(cnt2, cnt1)){
return true;
}
}
return false;
}
}