字符串排列
给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。
换句话说,第一个字符串的排列之一是第二个字符串的子串。
示例1:
输入: s1 = "ab" s2 = "eidbaooo"
输出: True
解释: s2 包含 s1 的排列之一 ("ba").
示例2:
输入: s1= "ab" s2 = "eidboaoo"
输出: False
注意:
- 输入的字符串只包含小写字母
- 两个字符串的长度都在 [1, 10,000] 之间
思路:
类似滑窗思想,先统计pattern字符串 s1
的字母表。然后每次从s2
中截取相应长度的字符串统计个数并对比字母表。
public boolean checkInclusion(String s1, String s2) {
if (s1 == null || s2 == null) {
return true;
}
int[] alpha = new int[26];
int len = s1.length();
int len2 = s2.length();
// 如果第二个字符串长度小,直接返回false
if (len2 < len) {
return false;
}
// 将 s1 存入字母表
for (int i = 0; i < len; i++) {
alpha[s1.charAt(i)-'a'] ++;
}
for (int i = 0; i < len2-len+1; i++) {
if (alpha[s2.charAt(i)-'a'] == 0) {
continue;
}
if (check(s2.substring(i,i+len), alpha.clone())) {
return true;
}
}
return false;
}
// str与字母表进行比对
public boolean check(String str, int alpha[]) {
for (int i = 0; i < str.length(); i++) {
alpha[str.charAt(i)-'a']--;
}
for (int i = 0; i < alpha.length; i++) {
if (alpha[i] != 0) {
return false;
}
}
return true;
}