当前位置:网站首页>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)
边栏推荐
- darknet source code reading notes-02-list.h and lish.c
- 网页端IM即时通讯开发:短轮询、长轮询、SSE、WebSocket
- Cholesterol-PEG-Maleimide,CLS-PEG-MAL,胆固醇-聚乙二醇-马来酰亚胺一种修饰性PEG
- clickhouse online and offline table
- 学习探索-网站中引入百度统计
- 并发编程原理学习-reentrantlock源码分析
- 从-99打造Sentinel高可用集群限流中间件
- 第一章 对象和封装
- 【 Gazebo introductory tutorial] speak the second model library into robot modeling and visualization (editor) model
- 荣耀互联对外开放,赋能智能硬件合作伙伴,促进全场景生态产品融合
猜你喜欢

Introduction of three temperature measurement methods for PT100 platinum thermal resistance

【LeetCode Daily Question】——374. Guess the size of the number

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

荣耀互联对外开放,赋能智能硬件合作伙伴,促进全场景生态产品融合

What does the product system of a digital financial enterprise look like?

如何模拟后台API调用场景,很细!

《机器学习的随机矩阵方法》

Catering Supply Chain Management System

Codeforces Round #811 (Div. 3)

JS兼容问题总结
随机推荐
el-date-picker 设置时间范围
信息系统项目管理师必背核心考点(六十)项目集管理
框架整合(二)- 使用Apache ShardingSphere实现数据分片
两个对象相同数据赋值
arm交叉编译
mysqlbinlog 超过500g自动删除,保留7个,求大深给个版本
设置表头颜色
JS兼容问题总结
基于clipboard.js对复制组件的封装
区间贪心(区间合并)
JWT主动校验Token是否过期
Thrift安装配置
88. (the home of cesium) cesium polymerization figure
动态数组底层是如何实现的
离散化求前缀和
LeetCode 每日一题——1403. 非递增顺序的最小子序列
DMPE-PEG-Mal,二肉豆蔻酰磷脂酰乙醇胺-聚乙二醇-马来酰亚胺简述
嵌入式开发:使用堆栈保护提高代码完整性
【日记】mysql数据库连接池
SRM供应商协同管理系统功能介绍