字符串的排列
给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。
换句话说,s1 的排列之一是 s2 的 子串 。
示例 1:
输入:s1 = “ab” s2 = “eidbaooo”
输出:true
解释:s2 包含 s1 的排列之一 (“ba”).
示例 2:
输入:s1= “ab” s2 = “eidboaoo”
输出:false
(上述题目来源于LeetCode)
解法(滑动窗口)
class Solution {
public boolean checkInclusion(String s1, String s2) {
//滑动窗口
//设置两个数组,将s1中出现的字符次数记录在arr1中,用s1的长度作为滑动窗口的长度
//每次将窗口中出现的字符次数记录在arr2中,比对两个数组,如果两个数组相同,
//则s1的排列之一是s2的子串
//如果数组不相同,将数组arr2全部置零,窗口每次向右移动一个位置进行对比
//这里用到一个boolean变量flag,如果数组相同则flag等于true
//最后通过flag来判断s1的排列是否是s2的子串
int length = s1.length();
if(length > s2.length()){
return false;
}else{
int start = 0;
int[] arr1 = new int[26];
int[] arr2 = new int[26];
boolean flag = true;
for(int i = 0;i < length;i++){
char ch = s1.charAt(i);
arr1[ch - 'a']++;
}
while(start < s2.length() - length + 1){
for(int j = start;j < length + start;j++){
char ch = s2.charAt(j);
arr2[ch - 'a']++;
}
for(int i = 0;i < 26;i++){
if(arr1[i] != arr2[i]){
for(int k = 0;k < 26;k++){
arr2[k] = 0;
}
flag = false;
break;
}
flag = true;
}
if(flag == false){
start++;
}else if(flag == true){
return true;
}
}
}
return false;
}
}