标签:子串 end sArr start int ++ 最小 76 字符串
class Solution {
public String minWindow(String s, String t) {
// 创建要覆盖的字符串数组,容量为ASCII值的数量
int[] tArr = new int[256];
int tLen = t.length();
int sLen = s.length();
for(int i = 0;i < tLen;i++){
// 将t字符串出现的位置置为1
tArr[t.charAt(i)]++;
}
// 定义t字符串覆盖的情况
int count = t.length();
// 定义结果区间的的左右指针
int left = -1,right = -1;
// 定义滑动窗口的左右指针
int start = 0;
// 定义被覆盖的数组
int[] sArr = new int[256];
// 窗口默认大小
int len = Integer.MAX_VALUE;
// 遍历s字符串
for(int end = 0;end < sLen;end++){
char c = s.charAt(end);
// 更新当前字符所在位置的频率+1
sArr[c]++;
// 若当前字符的频率小于等于要当前匹配的字符频率,说明匹配到了待匹配的字符
if(sArr[c] <= tArr[c])
// 可覆盖的字符-1
count--;
// 当窗口大小超出范围或还有可覆盖的字符,跳出循环
// 窗口向前移动
while(start <= end && count == 0){
char h = s.charAt(start);
sArr[h]--;
if(sArr[h] < tArr[h]){
count++;
}
// 若t字符串中还有没出现的字符,更新当前窗口位置
if(count > 0){
// 更新当前窗口的位置
if(len > end - start + 1){
left = start;
right = end;
len = right - left + 1;
}
}
// t字符串中还有没覆盖的字符,头指针前移
start++;
}
}
// 若结果区间的左指针位置没变,说明字符串中没有符合的子串
if(left == -1) return "";
return s.substring(left,right + 1);
}
}
Ronan0
标签:子串,end,sArr,start,int,++,最小,76,字符串 来源: https://blog.csdn.net/weixin_45900005/article/details/122137049
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。