给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的某个变位词。
换句话说,第一个字符串的排列之一是第二个字符串的 子串 。
示例 1:
输入: s1 = “ab” s2 = “eidbaooo”
输出: True
解释: s2 包含 s1 的排列之一 (“ba”).
示例 2:
输入: s1= “ab” s2 = “eidboaoo”
输出: False
提示:
1 <= s1.length, s2.length <= 104
s1 和 s2 仅包含小写字母
注意:本题与主站 567 题相同: https://leetcode-cn.com/problems/permutation-in-string/
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/MPnaiL
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
比较复杂又简单的一道题,其实有点类似滑动窗口,分析如下:
变位词的意思就是在一个字符串中,有无一段连续的子串,使字母都在另一个子串中出现,如果有返回 true,否则 返回 false,我们使用双指针加哈希表的方法来进行求解:
首先,遍历子串,把出现的字母所在数组位置加 1, 然后从 0 开始遍历字符串,第一个长度就是子串的长度(所以可以写在一个循环里)然后滑动窗口,如果此时不全为 0,说明不是变位词,继续向后滑动,新进入的字母的数字位置减一,出去的字母的数字位置加一,直到出现 counts 数组全为 0 的情况,此时出现变位词,如果一直没有,说明,需要返回 false。
class Solution {
int counts[];
public boolean checkInclusion(String s1, String s2) {
counts = new int[27];
if (s2.length() < s1.length()) {
return false;
}
for (int i = 0; i < s1.length(); i++) {
counts[s1.charAt(i) - 'a']++;
counts[s2.charAt(i) - 'a']--;
}
if (allZero()) {
return true;
}
for (int i = s1.length(); i < s2.length(); i++) {
counts[s2.charAt(i) - 'a']--;
counts[s2.charAt(i - s1.length()) - 'a']++;
if (allZero()) {
return true;
}
}
return false;
}
public boolean allZero() {
for (int count : counts) {
if (count != 0) {
return false;
}
}
return true;
}
}