[抄题]:

给定一个字符串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. ADS1.2使用

    ADS编译错误Error : A1163E: Unknown opcode ARM汇编指令不支持顶格写,否则不能识别,指令前加上空格即可. 使用for(;;;)//死循环,编译报错如下,说是该语句有错 ...

  2. 伴随我整十个年头的校内网,现名 人人网, 是不是要shut down 了

    如题: 每天我都习惯性的登录人人网,虽然现在基本上已经看不到曾经的同学上线了,不过我还是有事没事的往上面post 一些出行的照片,没事无聊的时候上这个网上看看自己曾经的照片,虽然已经无人在线,但是自己 ...

  3. JavaScript的this原理

    this原理 理解下面两种写法,可能有不一样的结果. var obj = { foo: function () {} }; var foo = obj.foo; // 写法一 obj.foo() // ...

  4. alsa-lib、alsa-utils移植

    /************************************************************************** * alsa-lib.alsa-utils移植 ...

  5. vue.js中引入图片

    vue中引入图片 前言:vue中引入图片时,会显示不出来,除非在css中引入.而在template中或者js动态引入时,会显示不出图片. 解决一 图片通过后端返回引入网络图片路径即可. <div ...

  6. opencv之读取pts文件

    #include <iostream> #include <fstream> #include <opencv2/opencv.hpp> using namespa ...

  7. bzoj 4570: [Scoi2016]妖怪 凸包

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4570 题解 我们知道如果一个怪物要取到攻击力的最大值,那么一定是把防御力都转化了 所以我 ...

  8. MacOS 如何截屏

    在Mac OS X下有很强大的截屏功能,它不仅仅是对屏幕的全屏COPY,而是包括很多细节在里面,就从这点来看,已经比过所有版本的Windows了. 下面我来向大家详细介绍一下: 对全屏的截图我们可以通 ...

  9. 微信跳一跳,Python辅助自动跳程序

    一.说明 此代码借鉴一位大神提供在gitHub上的源码,已经做了简化合并处理,成功连上手机并运行后,可实现自动玩微信跳一跳游戏,刷个1000+的分数轻轻松松 github源码地址 https://gi ...

  10. Flash 开发环境搭建和文字滚动效果实例

    Flash 开发环境搭建和文字滚动效果实例 一.Flash 开发环境搭建 Flash发布的时候可以将资源(即将库中的元件)集成到swf运行文件中.Flash没有代码自动输入补全功能,因此需要一个英文一 ...