class Solution {
public String minWindow(String s, String t) {
String result = s + "a";
//左右指针
int left = 0;
//标志位用于标识还是有多少个字符不符合条件
int mark = 0;
//首先使用一个长度为256的int数组来模拟hash表表示字符串t中所有出现的字符的次数,使用数组的下标作为key用于表示出现的字符,使用数组的值作为value用于表示字符出现的次数
int[] hash = new int[256];
//遍历t统计各个字符的个数,并更新mark用于统计右多少个不符合条件的字符
for(int i = 0;i < t.length();i++){
if(++hash[t.charAt(i)] == 1){
mark++;
}
}
//遍历s
for(int right = 0;right < s.length() || (mark == 0 && right == s.length());){
if(mark != 0){
//如果不是第一个字符,并且标志位不为0则,再hash中添加现在的right所在的字符,并且更新标志位
if(--hash[s.charAt(right++)] == 0){
mark--;
}
}
if(mark == 0){
//如果标志位变为了0,则说明现在s的子字符串中已经存在了t中所有的字符开始执行删加字符的操作
//现在的hash表应该是这样的,t中存在的所有字符已经为0了,t中不存在的字符现在应该时负数
//我们右移左指针判断当前左指针的元素如果删除之后会不会使得0的位置变为负数如果会则直接退出返回结果,如果不会则直接左移
if(right - left < result.length()){
result = s.substring(left,right);
}
hash[s.charAt(left)]++;
if(hash[s.charAt(left++)] == 1){
mark++;
}
}
}
//如果s遍历结束都没有包含t中的所有字符直接返回
return result.equals(s + "a") ? "" : result; }
}
剑指 Offer II 017. 含有所有字符的最短字符串
最新推荐文章于 2023-03-05 09:16:04 发布