题目描述:
给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。
换句话说,第一个字符串的排列之一是第二个字符串的子串。
示例1:
输入: s1 = “ab” s2 = “eidbaooo”
输出: True
解释: s2 包含 s1 的排列之一 (“ba”).
示例2:
输入: s1= “ab” s2 = “eidboaoo”
输出: False
注意:
输入的字符串只包含小写字母
两个字符串的长度都在 [1, 10,000] 之间
我们放入一个map中然后进行遍历,效率比较低
代码:
class Solution {
public boolean checkInclusion(String s1, String s2) {
Map<Character, Integer> map = new HashMap<>();
for (int i = 0; i < s1.length(); i++) {
map.put(s1.charAt(i), map.getOrDefault(s1.charAt(i), 0) + 1);
}
int len = s1.length();
for (int i = 0; i < s2.length() - len + 1; i++) {
if(map.getOrDefault(s2.charAt(i), 0) != 0){
Map<Character, Integer> map1 = new HashMap<>();
map1.putAll(map);
int j = 0;
for (j = 0; j < len; j++) {
int num = map1.getOrDefault(s2.charAt(i + j),0);
if(num == 0){
break;
}else {
map1.put(s2.charAt(i + j), num - 1);
}
}
if(j == len){
return true;
}
}
}
return false;
}
}
排名靠前的代码
2019年12月17日重置,使用的是滑动窗口,如果l-r的长度为len那么就说明已经够长度了,不需要进行后面的查看了
int[] record = new int[128];
for(char c:s1.toCharArray()){
record[c]++;
}
char[] arr = s2.toCharArray();
int l=0,r=0;
int len = s1.length();
while(r<s2.length()){
if(record[arr[r]]>0){
record[arr[r]]--;
r++;
if((r-l) == len){
return true;
}
}
else{
record[arr[l]]++;
l++;
}
}
return false;