首页 > 其他分享 >76. Minimum Window Substring

76. Minimum Window Substring

时间:2022-11-14 10:33:17浏览次数:47  
标签:字符 ch source counter Substring 76 Window right left

  • 变量定义:
    • 哈希表counter_scounter_t表示数组sourcetarget中有效字符的出现次数,其中,我们将有效字符定义为target中出现的字符。
    • start是最小覆盖子串的起始索引,minlen是最小覆盖子串的长度(从0计)。
    • valid表示source的窗口中满足counter_t出现次数要求的字符的个数。注意,相同的字符只计算一次。
    • leftright分别指向滑窗两端。
  • 算法流程:
    1. 初始化:left指针和right指针都指向s[0]
    2. 移动窗口右边界:将right指针右移,如果指向的字符ch是有效字符,那么counter_s[ch] += 1。如果字符ch的出现次数达标,那么valid += 1
    3. 当我们得到一个可行窗口,即包含target的全部字母的窗口时:
      • 判断此时的子串是否长度更小。如果是,更新子串的起始位置start和长度minlen
      • 移动窗口左边界:将left右移,如果离开的字符left_ch是有效字符,那么counter_s[left_ch] -= 1。如果字符left_ch的出现次数不再达标,那么valid -= 1
      • 如果窗口依然可行,循环步骤3。否则,跳转至步骤2。

 

public static String minWindow(String source , String target) {
// 初始化counter_s和counter_t
Map<Character, Integer> counter_t = new HashMap<>();
Map<Character, Integer> counter_s = new HashMap<>();
for (int i = 0; i < target.length(); i++) {
int count = counter_t.getOrDefault(target.charAt(i), 0);
counter_t.put(target.charAt(i), count + 1);
}

int left = 0, valid = 0;
// 记录最小覆盖子串的起始索引及长度
int start = -1, minlen = Integer.MAX_VALUE;
for (int right = 0; right < source.length(); right ++){
// 移动右边界, ch 是将移入窗口的字符
char ch = source.charAt(right);
// 如果counter_t里面包含source里的字符
if (counter_t.containsKey(ch)) {
// counter_s进行计数,注意,只有source中包含此字符,counter_s再进行计数
counter_s.put(ch, counter_s.getOrDefault(ch, 0) + 1);
// 对某个字符,只有counter_s和counter_t对其的计数一样,例如:counter_t中字符B出现3次,counter_s中字符B也出现3次,valid才加1
if (counter_s.get(ch).equals(counter_t.get(ch))) {
valid++;
}
}
// 判断左侧窗口是否要收缩
while (valid == counter_t.size()) {
// 更新最小覆盖子串
if (right - left < minlen) {
start = left;
minlen = right - left;
}
// left_ch 是将移出窗口的字符
char left_ch = source.charAt(left);
// 左移窗口
left++;
// 进行窗口内数据的一系列更新
if (counter_t.containsKey(left_ch)) {
// 因为left_ch被移出去了,所以要判断下valid是否要减小
if (counter_t.get(left_ch).equals(counter_s.get(left_ch))) {
valid--;
}
//之前的逻辑是:只有source中包含此字符,counter_s再进行计数,此时移除了,所以要减小counter_s的计数
counter_s.put(left_ch, counter_s.getOrDefault(left_ch, 0) - 1);
}
}
}
// 返回最小覆盖子串
return start == -1 ? "" : source.substring(start, start + minlen + 1);
}

标签:字符,ch,source,counter,Substring,76,Window,right,left
From: https://www.cnblogs.com/MarkLeeBYR/p/16888228.html

相关文章

  • Windows 下重置 MariaDB 密码
    重置MariaDB的root密码需要先停止MariaDB的服务服务停止后,我们编辑如下内容,保存为一个TXT文件,文件名可自定义,这里保存为reset-password.txt:UPDATEmysql.userSE......
  • 在Windows平台使用Visual C++ 2022编译QT6源码
    在Windows平台使用VisualC++2022编译QT6源码目录在Windows平台使用VisualC++2022编译QT6源码0.引言1.准备工作2.配置3.编译和安装0.引言如果您想......
  • 在Windows平台编译、安装Ninja
    在Windows平台编译、安装Ninja目录在Windows平台编译、安装Ninja0、准备工作1、获取Ninja的源代码2、编译3、环境变量设置X、链接0、准备工作操作系统环境:Windows10/11......
  • String.Remove()、String.Substring()
    https://blog.csdn.net/n_moling/article/details/78953658Remove(intstartIndex):删除此字符串中从指定位置到最后位置的所有字符。Remove(intstartIndex,intlength......
  • DTOJ 5769 下棋 题解
    题目链接portal题解首先比较容易想到\(dp\),因为任意一段绝对值不超过\(k\),所以白棋个数减黑棋个数要在\([-k,k]\)区间里,我们于是考虑把状态设为白棋减黑棋个数......
  • Windows 存储池
    #查看物理磁盘Get-PhysicalDisk|ftFriendlyName,DeviceId,BusType,UniqueId,Size,MediaType-auto#物理磁盘改名Set-PhysicalDisk-UniqueId"youruniqueid"-New......
  • 记录美化Windows Terminal
    通过OhMyPosh来自定义PowerShell,以提供Git状态提示符,再对WindowsTerminal美化,得到一个优秀的终端体验。获取PowerShellWindows自带的PowerShell是5.x版......
  • windows家庭版打开组策略失败
    情况描述:win+r  然后输入gpedit.msc发现打开本地组策略失败,windows家庭版默认没有组策略解决办法:把下面的批处理脚本复制到文本,然后命名文件夹为xx.bat格式的文件,鼠标......
  • windows家庭版安装svn失败,提示2503,2502错误
    情况描述:windows家庭版安装svn失败,提示2503,2502错误,按提示关闭一些程序也会提示,安装失败;解决办法:1.首先在组策略启用“始终以提升的权限安装”win+r  然后输入gpedit......
  • Windows系统中使用GIT通过SSH连接Github
    打开GitBash运行以下代码:gitconfig--globaluser.name"XXXXX"#这里XXXXX为github的用户名gitcongif--globaluser.email"[email protected]" #github的注册邮箱......