今天在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 算法-最小子串覆盖相关推荐

  1. 计算机基础算法棋盘覆盖,分治算法求解棋盘覆盖问题互动教学过程.doc

    分治算法求解棋盘覆盖问题互动教学过程 分治算法求解棋盘覆盖问题互动教学过程 摘要:针对算法设计与分析课程难度较大.对学生编程能力要求较高的现状,通过对棋盘覆盖问题的分治算法求解过程进行互动教学设计,引 ...

  2. java二分查找法_java算法之二分查找法的实例详解

    java算法之二分查找法的实例详解 原理 假定查找范围为一个有序数组(如升序排列),要从中查找某一元素,如果该元素在此数组中,则返回其索引,否则返回-1.通过数组长度可取出中间位置元素的索引,将其值与 ...

  3. java 不同包子类 覆盖_Java中不同方法的覆盖方法

    经过测试 覆盖的好处是能够定义特定于子类类型的行为,这意味着子类可以根据其要求实现父类方法. 用面向对象的术语来说,覆盖是指覆盖现有方法的功能. 示例class Animal { public voi ...

  4. java统计空格代码_java算法大全之统计出其中英文字母、空格、数字和其它字符的个数...

    java算法大全之统计出其中英文字母.空格.数字和其它字符的个数.算法题目:输入一行字符,分别统计出其中英文字母.空格.数字和其它字符的个数.统计字符类型写了重载的两个方法,一个接受字符串作为参数,一 ...

  5. java文件写入不覆盖_java写入文件不覆盖写入_Java写入文件–用Java写入文件的4种方法...

    java写入文件不覆盖写入 Java provides several ways to write to file. We can use FileWriter, BufferedWriter, ja ...

  6. java数组排列组合_java算法题--递归求数组中数字排列组合问题

    java算法题–递归求数组中数字排列组合问题 题目:有一个数组{1,2,3},输出数组中数字的所有可能组合: 比如:123.132.213- 解题思路 通过递归不停的交换数组中的两个数(当然,肯定是有 ...

  7. java 静态方法覆盖_Java中方法的覆盖和静态方法的隐藏

    下面的程序对巴辛吉小鬣狗和其它狗之间的行为差异进行了建模.如果你不知道 什么是巴辛吉小鬣狗,那么我告诉你,这是一种产自非洲的小型卷尾狗,它们从 来都不叫唤.那么,这个程序将打印出什么呢? class ...

  8. java多态 覆盖_Java ------ 继承、方法覆盖、多态

    一.什么是继承 面向对象的三大特性: 封装. 继承.多态: 继承就是子类型将父类型的的属性继承到自己类中进行使用,通过继承的方式子类型可以使用父类型的属性和方法,并且,继承只能单重继承,无法多继承,但 ...

  9. java set是重复_java算法题,set内出现重复元素

    题目 将数字 1-9 填入一个3×3 的九宫格中, 使得格子中每一横行和的值全部相等, 每一竖列和的值全部相等. 请你计算有多少种填数字的方案. 这个是计蒜客上面的一个模拟题,我采用暴力. publi ...

最新文章

  1. 【JVM】通过javap命令分析Java汇编指令
  2. Quick Dicom batch editor(DICOM标签浏览编辑器)
  3. phalapi做登录检测_phalApi
  4. 智能一代云平台(二十二):多租户方案比较Hibernate、EclipseLink、Mybatis+Mycat
  5. 习题总结(一)——硬链接,locate,chmod,家目录
  6. html5 2.5d,修仙三国:首款HTML5三国背景2.5D角色扮演页游
  7. Atitit.软件仪表盘(7)--温度监测子系统--电脑重要部件温度与监控and警报
  8. mysql数据恢复或数据找回方法
  9. 【2020】微软 MCSA,MCSD,MCSE认证于2021年1月31停用,此后您将无法再获得此认证 - GJYJSJGS - 高级云计算架构师
  10. mysql捕获1300的错误_pt-osc 变更时遇到 “MySQL error 1300” 报错问题解决
  11. php红包退回通知,php红包
  12. 蓝牙耳机选哪种的比较好、高端蓝牙耳机推荐
  13. GPS定位系统及协议介绍
  14. CUDA:CUDA out of memory. Tried to allocate 100.00 MiB (GPU 0; 15.78 GiB total capacity; 14.24 GiB al
  15. Python.random.seed()用法
  16. Java毕设项目艾灸减肥管理网站计算机(附源码+系统+数据库+LW)
  17. 追风去 不如造风来——致敬蚂蚁区块链创新大赛中的参与者们
  18. git rebase origin master 和 origin/master
  19. 机器学习 李宏毅 L32-Structured Learning-Introduction
  20. 从传统到现代:中国制造业信息化探索

热门文章

  1. 二进制位交换,反转,与统计1的个数
  2. 整数域上的多项式辗转相除
  3. Rust学习资料大全
  4. gdb调试命令的使用及总结
  5. C++的深拷贝与浅拷贝
  6. 【网络编程】之十、重叠IO Overlapped IO
  7. cocos2d-x游戏实例(9)-A星算法(5)
  8. Android 图形系统
  9. OkHttp3中的HTTP/2首部压缩
  10. 抖音访问太频繁-设备注册分析