[抄题]:

给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串。

在答案的子串中的字母在目标字符串中是否需要具有相同的顺序?

——不需要。

给出source = "ADOBECODEBANC",target = "ABC" 满足要求的解  "BANC"

[暴力解法]:

时间分析:

空间分析:

[思维问题]:

原来哈希算法不仅仅是哈希表,int 256数组也可以被称作哈希

[一句话思路]:

boys & girls窗口型两指针

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

[一刷]:

  1. targethash 和 sourcehash在此处都是比较一共出现了多少次,而不是对应位置上是否相等。所以0-256所有的字符都要比
  2. 存所有的字母c和存数字0-256效果相同

[二刷]:

[三刷]:

[四刷]:

[五刷]:

[五分钟肉眼debug的结果]:

[关键模板化代码]:

for (i = 0; i < source.length(); i++) {
//accumulate if not valid
while(j < source.length() && !valid(sourcehash, targethash)) {
sourcehash[source.charAt(j)]++;
j++;
}
//change if valid
if (valid(sourcehash, targethash) && (j - i) < ans) {
ans = Math.min(ans, j - i);
minStr = source.substring(i,j);
}
//back to i + 1
sourcehash[source.charAt(i)]--;
}

j在i中量变、质变

[总结]:

结果是两个256哈希数组进行比较,如果字母次数不如target就不符合

[复杂度]:Time complexity: O(2n) Space complexity: O(n)

[英文数据结构或算法,为什么不用别的数据结构或算法]:

[其他解法]:

[Follow Up]:

[LC给出的题目变变变]:

567. Permutation in String 字符串中字母相等:用指针

Substring with Concatenation of All Words 字符串中字母相等:用指针

[代码风格] :

.substring 单独一个独立的方法,应该都用小写

public class Solution {
/**
* @param source : A string
* @param target: A string
* @return: A strindenote the minimum window, return "" if there is no such a string
*/
void initTargetHash (int[] targethash, String target) {
for (char ch: target.toCharArray()) {
targethash[ch]++;
}
} public boolean valid(int[] sourcehash, int[] targethash) {
for (int i = 0; i < 256; i++) {
if (sourcehash[i] < targethash[i]) {
return false;
}
}
return true;
} public String minWindow(String source , String target) {
//corner case
String minStr = "";
if (source.length() < target.length()) {
return minStr;
} int[] sourcehash = new int[256];
int[] targethash = new int[256];
int i = 0, j = 0;
int ans = Integer.MAX_VALUE; //initialization
initTargetHash (targethash, target);
//i,j go in the same direction
for (i = 0; i < source.length(); i++) {
//accumulate if not valid
while(j < source.length() && !valid(sourcehash, targethash)) {
sourcehash[source.charAt(j)]++;
j++;
}
//change if valid
if (valid(sourcehash, targethash) && (j - i) < ans) {
ans = Math.min(ans, j - i);
minStr = source.substring(i,j);
}
//back to i + 1
sourcehash[source.charAt(i)]--;
}
//return
return minStr;
}
}

最小子串覆盖 · Minimum Window Substring的更多相关文章

  1. LeetCode 76. 最小覆盖子串(Minimum Window Substring)

    题目描述 给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", T = "ABC ...

  2. lintcode 中等题:minimum window substring 最小子串覆盖

    题目 最小子串覆盖 给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串. 样例 给出source = "ADOBECODEBANC ...

  3. Lintcode--004(最小子串覆盖)

    给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串. 注意事项 如果在source中没有这样的子串,返回"",如果有多个 ...

  4. leetcode76. Minimum Window Substring

    leetcode76. Minimum Window Substring 题意: 给定字符串S和字符串T,找到S中的最小窗口,其中将包含复杂度O(n)中T中的所有字符. 例如, S ="AD ...

  5. Minimum Window Substring @LeetCode

    不好做的一道题,发现String Algorithm可以出很多很难的题,特别是多指针,DP,数学推导的题.参考了许多资料: http://leetcode.com/2010/11/finding-mi ...

  6. LeetCode解题报告—— Minimum Window Substring && Largest Rectangle in Histogram

    1. Minimum Window Substring Given a string S and a string T, find the minimum window in S which will ...

  7. 【LeetCode】76. Minimum Window Substring

    Minimum Window Substring Given a string S and a string T, find the minimum window in S which will co ...

  8. 刷题76. Minimum Window Substring

    一.题目说明 题目76. Minimum Window Substring,求字符串S中最小连续字符串,包括字符串T中的所有字符,复杂度要求是O(n).难度是Hard! 二.我的解答 先说我的思路: ...

  9. 53. Minimum Window Substring

    Minimum Window Substring Given a string S and a string T, find the minimum window in S which will co ...

随机推荐

  1. cetos7 systemd 详解

      CentOS7/RHEL7 systemd详解 目录1. 为什么是systemd(1) 关于Linux服务管理(2) SysV init的优缺点(3) UpStart的改进(4) systemd的 ...

  2. bacnet ip转MQTT

    迈思德网关最新支持BACNET IP协议,可以将BACNET IP转换为MODBUS.MQTT.OPC等协议,与百度天工,阿里云等无缝对接. 支持AI.AO.DI.DO.AV.DV六个对象的读写.

  3. 经典排序方法 python

    数据的排序是在解决实际问题时经常用到的步骤,也是数据结构的考点之一,下面介绍10种经典的排序方法. 首先,排序方法可以大体分为插入排序.选择排序.交换排序.归并排序和桶排序四大类,其中,插入排序又分为 ...

  4. PyalgoTrade 计算权重平滑平均价(三)

    本节介绍如何使用收盘价的SMA价格的策略 from pyalgotrade import strategy from pyalgotrade.barfeed import yahoofeed from ...

  5. 片段的findFragmentById

    class类名 名字 = calss类名 getFragmentManager().findFragmentById(R.id.布局id) 因为需要获取到片段的管理者,才可以去寻找到相应的布局.

  6. rabbitmq学习(一):AMQP协议,AMQP与rabbitmq的关系

    前言 当学习完AMQP的基本概念后,可以到http://tryrabbitmq.com/中利用rabbitmq模拟器进行消息的模拟发送和接收 一.什么是AMQP,AMQP与rabbitmq的关系 AM ...

  7. 掉电脉冲映射串口log和dmesg到文件中的log

    1.echo 1 > /mytest/boot_times 2.systemctl enable i2c_dmesg.service root:/mytest# tree . |-- boot_ ...

  8. 使用xUnit为.net core程序进行单元测试(2)

    第一部分: http://www.cnblogs.com/cgzl/p/8283610.html 下面有一点点内容是重叠的.... String Assert 测试string是否相等: [Fact] ...

  9. php 数据类型转换与比较

    <?php define("PI", 3.1415926); echo PI."<br>"; //定义一个常量 define("GR ...

  10. Windows 无法安装到所选位置。错误:0x80300001

    Windows 无法安装到所选位置.错误:0x80300001 这里遇到的情况是这样的,iDrac安装windows 2008 R2,一开始映射 windows 2008 R2系统镜像,后来,阵列驱动 ...