题目
给你两个字符串 s1
和 s2
,写一个函数来判断 s2
是否包含 s1
的排列。如果是,返回 true
;否则,返回 false
。
换句话说,s1
的排列之一是 s2
的 子串 。
示例1
输入:s1 = "ab" s2 = "eidbaooo" 输出:true 解释:s2 包含 s1 的排列之一 ("ba").
示例2
输入:s1= "ab" s2 = "eidboaoo" 输出:false
想了两种解法,一种是传统的滑动窗口,还有一种是刚好在看函数的表格,想到能用,虽然击败的人不多,但是很好理解,代码量也少;不了解函数或者看不懂的可以评论区问;
解法一
class Solution {
public boolean checkInclusion(String s1, String s2) {
if(s1.length()>s2.length())
return false;
boolean res=true;
int[] book = new int [26];
int [] book1 = new int [26];
for(int i=0;i<s1.length();i++){
book[s1.charAt(i)-'a']++;
book1[s2.charAt(i)-'a']++;
}
if(Arrays.equals(book,book1))
return true;
for(int i=s1.length();i<s2.length();i++){ //窗口滑动,往右滑动一个左边也移一位;
book1[s2.charAt(i)-'a']++; //每向右移动一次就多统计一次进入窗口的字符
book1[s2.charAt(i-s1.length())-'a']--; //少统计一次离开的窗口的字符;
if(Arrays.equals(book,book1)){
return true;
}
}
return false;
}
}
解法二
class Solution {
public:
bool checkInclusion(string s1, string s2) {
if (s1.size() > s2.size())
return false;
// 字符串排个序
sort(s1.begin(), s1.end());
bool res = false;
int n = s1.size();
for (int i = 0; i <=s2.size() - n; i++) {
//因为需要n个数据,所有s2.size()-n;后面小于n的例子没必要
string ch = s2.substr(i, n);
sort(ch.begin(), ch.end());
if (ch == s1) {
return true;
}
}