java最小子串覆盖_Java 算法-最小子串覆盖
今天在lintCode上做了一道题,感觉有必要将它记录下来。
1. 概览
(1).题意
给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串。
(2).注意事项
如果在source中没有这样的子串,返回"",如果有多个这样的子串,返回长度最小的子串。(注意:lintCode上说的是起始位置最小,但是我认为它说错了)。
(3).说明
在答案的子串中的字母在目标字符串中是否需要具有相同的顺序?--不需要。
(4).样例
给出source = "ADOBECODEBANC",target = "ABC" 满足要求的解 "BANC"
2.解题思路
这道题的思路非常的简单,就是哈希表的操作。
首先,我们创建一个哈希表,遍历target字符串,更新每个字符的出现的次数;然后定义一个count变量,初始换为target字符串的长度。
其次,我们在遍历source字符串,更新哈希表。
我知道,这样说的话,肯定不好明白意思,接下来我贴代码,然后再详细的解释。
3.代码
public String minWindow(String source, String target) {
if (source.equals(target)) {
return target;
}
if (target.equals("") || source.equals("")) {
return "";
}
int [] map = new int[128];
int count = target.length();
int begin = 0;
int head = 0;
int end = 0;
int d = Integer.MAX_VALUE;
for (int i = 0; i < target.length(); i++) {
map[target.charAt(i)]++;
}
while (end < source.length()) {
if(map[source.charAt(end++)]-- > 0) {
count--;
}
while (count == 0) {
if (d > end - begin) {
d = end - begin;
head = begin;
}
if(map[source.charAt(begin++)]++ ==0) {
count++;
}
}
}
return d == Integer.MAX_VALUE ? "" : source.substring(head, head + d);
}
map[source.charAt(end++)]--就是用来更新我们的哈希表。但是这里为什么只有大于0时,count才减减?因为之后在大于0时,表示更新的字符才是target中的字符。
当count等于0时,source的begin~end的子串中含有全部target字符了。然后我们在更新head,如果d > end - end,head等于begin。
为什么map[source.charAt(begin++)]++ ==0时,count需要加加呢?因为在end ~ begin之间有可能出现了target的字符多次,我们需要更新begin,来调整距离,使得距离最小。
java最小子串覆盖_Java 算法-最小子串覆盖相关推荐
- 计算机基础算法棋盘覆盖,分治算法求解棋盘覆盖问题互动教学过程.doc
分治算法求解棋盘覆盖问题互动教学过程 分治算法求解棋盘覆盖问题互动教学过程 摘要:针对算法设计与分析课程难度较大.对学生编程能力要求较高的现状,通过对棋盘覆盖问题的分治算法求解过程进行互动教学设计,引 ...
- java二分查找法_java算法之二分查找法的实例详解
java算法之二分查找法的实例详解 原理 假定查找范围为一个有序数组(如升序排列),要从中查找某一元素,如果该元素在此数组中,则返回其索引,否则返回-1.通过数组长度可取出中间位置元素的索引,将其值与 ...
- java 不同包子类 覆盖_Java中不同方法的覆盖方法
经过测试 覆盖的好处是能够定义特定于子类类型的行为,这意味着子类可以根据其要求实现父类方法. 用面向对象的术语来说,覆盖是指覆盖现有方法的功能. 示例class Animal { public voi ...
- java统计空格代码_java算法大全之统计出其中英文字母、空格、数字和其它字符的个数...
java算法大全之统计出其中英文字母.空格.数字和其它字符的个数.算法题目:输入一行字符,分别统计出其中英文字母.空格.数字和其它字符的个数.统计字符类型写了重载的两个方法,一个接受字符串作为参数,一 ...
- java文件写入不覆盖_java写入文件不覆盖写入_Java写入文件–用Java写入文件的4种方法...
java写入文件不覆盖写入 Java provides several ways to write to file. We can use FileWriter, BufferedWriter, ja ...
- java数组排列组合_java算法题--递归求数组中数字排列组合问题
java算法题–递归求数组中数字排列组合问题 题目:有一个数组{1,2,3},输出数组中数字的所有可能组合: 比如:123.132.213- 解题思路 通过递归不停的交换数组中的两个数(当然,肯定是有 ...
- java 静态方法覆盖_Java中方法的覆盖和静态方法的隐藏
下面的程序对巴辛吉小鬣狗和其它狗之间的行为差异进行了建模.如果你不知道 什么是巴辛吉小鬣狗,那么我告诉你,这是一种产自非洲的小型卷尾狗,它们从 来都不叫唤.那么,这个程序将打印出什么呢? class ...
- java多态 覆盖_Java ------ 继承、方法覆盖、多态
一.什么是继承 面向对象的三大特性: 封装. 继承.多态: 继承就是子类型将父类型的的属性继承到自己类中进行使用,通过继承的方式子类型可以使用父类型的属性和方法,并且,继承只能单重继承,无法多继承,但 ...
- java set是重复_java算法题,set内出现重复元素
题目 将数字 1-9 填入一个3×3 的九宫格中, 使得格子中每一横行和的值全部相等, 每一竖列和的值全部相等. 请你计算有多少种填数字的方案. 这个是计蒜客上面的一个模拟题,我采用暴力. publi ...
最新文章
- 【JVM】通过javap命令分析Java汇编指令
- Quick Dicom batch editor(DICOM标签浏览编辑器)
- phalapi做登录检测_phalApi
- 智能一代云平台(二十二):多租户方案比较Hibernate、EclipseLink、Mybatis+Mycat
- 习题总结(一)——硬链接,locate,chmod,家目录
- html5 2.5d,修仙三国:首款HTML5三国背景2.5D角色扮演页游
- Atitit.软件仪表盘(7)--温度监测子系统--电脑重要部件温度与监控and警报
- mysql数据恢复或数据找回方法
- 【2020】微软 MCSA,MCSD,MCSE认证于2021年1月31停用,此后您将无法再获得此认证 - GJYJSJGS - 高级云计算架构师
- mysql捕获1300的错误_pt-osc 变更时遇到 “MySQL error 1300” 报错问题解决
- php红包退回通知,php红包
- 蓝牙耳机选哪种的比较好、高端蓝牙耳机推荐
- GPS定位系统及协议介绍
- CUDA:CUDA out of memory. Tried to allocate 100.00 MiB (GPU 0; 15.78 GiB total capacity; 14.24 GiB al
- Python.random.seed()用法
- Java毕设项目艾灸减肥管理网站计算机(附源码+系统+数据库+LW)
- 追风去 不如造风来——致敬蚂蚁区块链创新大赛中的参与者们
- git rebase origin master 和 origin/master
- 机器学习 李宏毅 L32-Structured Learning-Introduction
- 从传统到现代:中国制造业信息化探索