参考大佬总结
最小覆盖字串
class Solution {
public String minWindow(String S, String t) {
Map<Character,Integer> need=new HashMap<>();
Map<Character,Integer> window=new HashMap<>();
for(char tt:t.toCharArray()){
need.put(tt,need.getOrDefault(tt,0)+1);
}
int left=0,right=0;
int valid=0;
int first=0,len=Integer.MAX_VALUE;
while(right<S.length()){
char a=S.charAt(right);
right++;
window.put(a,window.getOrDefault(a,0)+1);
if(window.get(a).equals(need.get(a))){
valid++;
}
while(valid==need.size()){
if(right-left<len){
first=left;
len=right-left;
}
char b=S.charAt(left);
left++;
if(window.get(b).equals(need.get(b))){
valid--;
}
window.put(b,window.get(b)-1);
}
}
return len==Integer.MAX_VALUE?"":S.substring(first,first+len);
}
}
字符串的排列
class Solution {
public boolean checkInclusion(String s1, String s2) {
Map<Character,Integer> need=new HashMap<>();
Map<Character,Integer> window=new HashMap<>();
for(char s:s1.toCharArray()){
need.put(s,need.getOrDefault(s,0)+1);
}
int left=0,right=0;
int valid=0;
int start=0,len=Integer.MAX_VALUE;
while(right<s2.length()){
char a=s2.charAt(right);
right++;
window.put(a,window.getOrDefault(a,0)+1);
if(window.get(a).equals(need.get(a))){
valid++;
}
while(valid==need.size()){
if(right-left<len){
start=left;
len=right-left;
}
char b=s2.charAt(left);
left++;
if(window.get(b).equals(need.get(b))){
valid--;
}
window.put(b,window.get(b)-1);
}
}
if(len==Integer.MAX_VALUE){
return false;
}
if(len==s1.length()){
return true;
}else{
return false;
}
}
}
找到字符串所有字母异位词
class Solution {
public List<Integer> findAnagrams(String s, String p) {
Map<Character, Integer> need = new HashMap<>();
Map<Character, Integer> window = new HashMap<>();
List<Integer> res=new ArrayList<>();
for(char pp:p.toCharArray()){
need.put(pp,need.getOrDefault(pp,0)+1);
}
int left=0,right=0;
int valid=0;
while(right<s.length()){
char a=s.charAt(right);
right++;
window.put(a,window.getOrDefault(a,0)+1);
if(window.get(a).equals(need.get(a))){
valid++;
}
while(valid==need.size()){
if(right-left==p.length()){
res.add(left);
}
char b=s.charAt(left);
left++;
if(window.get(b).equals(need.get(b))){
valid--;
}
window.put(b,window.get(b)-1);
}
}
return res;
}
}
无重复字符的最长子串
class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> window = new HashMap<>();
int res=0;
int left=0,right=0;
while(right<s.length()){
char a=s.charAt(right);
right++;
window.put(a,window.getOrDefault(a,0)+1);
while(window.get(a)>1){
char b=s.charAt(left);
left++;
window.put(b,window.getOrDefault(b,0)-1);
}
res=Math.max(res,right-left);
}
return res;
}
}