字符串的重新排列
一、题目描述
二、套入模板
class Solution {
public boolean checkInclusion(String s1, String s2) {
HashMap<Character,Integer> need=new HashMap<>();
HashMap<Character,Integer> window=new HashMap<>();
for(char ch:s1.toCharArray()){
need.put(ch,need.getOrDefault(ch,0)+1);
}
char chs[]=s2.toCharArray();
int left=0;
int right=0;
int valid=0;
while(right<s2.length()){
char c=chs[right];
right++;
if(need.containsKey(c)){
window.put(c,window.getOrDefault(c,0)+1);
if(need.get(c).equals(window.get(c)))
valid++;
}
while(right-left>=s1.length()){
if(valid==need.size())
return true;
char d=chs[left];
left++;
if(need.containsKey(d)){
if(need.get(d).equals(window.get(d))){
valid--;
}
window.put(d,window.get(d)-1);
}
}
}
return false;
}
}
- 解题思路
1、本题移动 left 缩⼩窗⼝的时机是窗⼝⼤⼩⼤于 t.size() 时,应为排列嘛,显然⻓度应该是⼀样的。
2、当发现 valid == need.size() 时,就说明窗⼝中就是⼀个合法的排列,所以⽴即返回 true。