当前位置:网站首页>leetcode/含有所有字符的最短字符串
leetcode/含有所有字符的最短字符串
2022-08-04 17:43:00 【xcrj】
代码
package com.xcrj;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/** * 剑指 Offer II 017. 含有所有字符的最短字符串 * t中的所有字符都要包含,t中若有重复的字符也要包含 * 给定两个字符串 s 和t 。返回 s 中包含t的所有字符的最短子字符串。如果 s 中不存在符合条件的子字符串,则返回空字符串 "" 。 * 如果 s 中存在多个符合条件的子字符串,返回任意一个。 * 注意 s和t中含有大写或小写字母,因此不能简单直接使用solution15变位词的解法 */
public class Solution17 {
// Map<字符,出现次数>
private Map<Character, Integer> tmap = new HashMap<>();
//
private Map<Character, Integer> smap = new HashMap<>();
/** * 双指针 * r不停的右移,直到l~r的字符都包含在t中 * t的所有字符仍然被包含,l左移 */
public String minWindow1(String s, String t) {
// 特殊情况
if (s.length() < t.length()) {
return "";
}
// 统计t中字符
for (char c : t.toCharArray()) {
tmap.put(c, tmap.getOrDefault(c, 0) + 1);
}
int minLen = Integer.MAX_VALUE;
int start = 0;
int l = 0;
int r = -1;
// !!!记住这个滑动窗口的双wihle模板代码
while (r < s.length()) {
// 右移r:r不停的右移,直到l~r的字符都包含在t中
r++;
if (r < s.length() && tmap.containsKey(s.charAt(r))) {
// 统计t包含 s字符串的l~r字符
smap.put(s.charAt(r), smap.getOrDefault(s.charAt(r), 0) + 1);
}
// 右移l:检查l~r的s子串中的每个字符的数量>=t中每个字符的数量,尝试右移l
while (l <= r && check1()) {
// 右移l过程中判断最小长度
if (r - l + 1 < minLen) {
minLen = r - l + 1;
start = l;
}
// 统计,剔除l指向的s中的字符
if (smap.containsKey(s.charAt(l))) {
smap.put(s.charAt(l), smap.get(s.charAt(l)) - 1);
}
l++;
}
}
return minLen == Integer.MAX_VALUE ? "" : s.substring(start, start + minLen);
}
/** * l~r的s子串中的每个字符的数量>=t中每个字符的数量 * 检查t字符串中的所有字符是否都被包含在了 s字符串中的l~r中 * 已知 t字符串的统计散列表 tmap * 已知 s字符串l~r的统计散列表 smap */
public boolean check1() {
for (Map.Entry<Character, Integer> tentry : tmap.entrySet()) {
// l~r在smap中统计的字符数量 一定要>= tmap统计的字符数量,如果小于则不满足 s(l~r)要包含t中所有字符的条件,如果>则存在右移的机会
if (smap.getOrDefault(tentry.getKey(), 0) < tentry.getValue()) {
return false;
}
}
// l~r的s子串中的每个字符的数量>=t中每个字符的数量
return true;
}
public static void main(String[] args) {
Solution17 solution17 = new Solution17();
System.out.println(solution17.minWindow1("a", "b"));
}
}
参考
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/M1oyTv/solution/han-you-suo-you-zi-fu-de-zui-duan-zi-fu-a8q50/
来源:力扣(LeetCode)
边栏推荐
猜你喜欢

Boost library study notes (1) Installation and configuration

localhost,127.0.0.1,本机IP

mysqlbinlog 超过500g自动删除,保留7个,求大深给个版本

从-99打造Sentinel高可用集群限流中间件

【图像分类】2021-DeiT

Digital-intelligent supply chain management system for chemical manufacturing industry: build a smart supply system and empower enterprises to improve production efficiency

php如何查询字符串以什么开头

Understand Chisel language. 32. Chisel advanced hardware generator (1) - parameterization in Chisel

基于层次分析法的“内卷”指数分析

租房小程序登顶码云热门
随机推荐
The prefix and discretization
R语言ggpubr包的ggtexttable函数可视化表格数据(直接绘制表格图或者在图像中添加表格数据)、使用ggarrange函数将表格数据和可视化图像组合起来(表格数据在可视化图像下方)
树莓派连接蓝牙音箱
消灭异步回调,还得是async-await
《机器学习的随机矩阵方法》
R语言glm函数使用频数数据构建二分类logistic回归模型,分析的输入数据为频数数据(多个分类指标对应的阴性样本和阳性样本的频数数据)、weights参数指定频数值
如何模拟后台API调用场景,很细!
【日记】mysql数据库连接池
R语言ggplot2可视化:使用ggpubr包的ggbarplot函数可视化柱状图、color参数指定柱状图的边框的色彩
我的大一.
RecyclerView 缓存与复用机制
怎么面试程序员的?傲慢与无礼,就数他牛逼
两个对象相同数据赋值
PT100铂热电阻三种测温方法介绍
2022年7月31日 暑假第三周总结
R语言dplyr包group_by函数和summarise_at函数计算dataframe计算不同分组的计数个数和均值、使用%>%符号将多个函数串起来
What does the product system of a digital financial enterprise look like?
JWT主动校验Token是否过期
租房小程序登顶码云热门
88.(cesium之家)cesium聚合图