题目描述
给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。换句话说,s1 的排列之一是 s2 的 子串 。
求解思路
- 这道题目是要判断s1是不是s2的子串,那么就可以理解为在s2中取长度和s1相等的子串,判断他们所有元素是否相同,如果所有元素相同则认为这个s2的子串和s1是相等的,所有,s2包含s1的排列;
- 创建两个数组arr1和arr2,用来分别保存是s1和s2子串的字母出现次数;
- 只需要对比arr1和arr2是否相等既可以判断s2子串是否包含s1排列。
输入输出示例
代码
class Solution {
public boolean checkInclusion(String s1, String s2) {
int n1 = s1.length();
int n2 = s2.length();
if(n1 > n2) return false;
int[] arr1 = new int[26];
int[] arr2 = new int[26];
for(int i = 0; i < n1; i++){
arr1[s1.charAt(i) - 'a']++;
arr2[s2.charAt(i) - 'a']++;
}
if(Arrays.equals(arr1,arr2)){
return true;
}
for(int i = n1; i < n2; i++){
arr2[s2.charAt(i-n1) - 'a']--;
arr2[s2.charAt(i) - 'a']++;
if(Arrays.equals(arr1,arr2)){
return true;
}
}
return false;
}
}