题目来源:

  https://leetcode.com/problems/minimum-window-substring/


题意分析:

  给定两个字符串S和T。在S中找到最短的一个子字符串使得他包括所有的T。比如:S = "ADOBECODEBANC",T = "ABC",那么返回"BANC"。要求时间复杂度O(n)。


题目分析:

  利用字典记录T中每个字符出现的次数。①在S中找到最开始包括所有T中字符的一个结果,并且使得这个结果的第一个字符是T中的。也就是先找到一个满足答案。上题例子就是找到了"ADOBEC",更新目前的答案,使得当前答案中没有更短的字符串满足,也就是说,如果上题找到的满足是"AADOBEC"的话,要更新为"ADOBEC",记录当前的长度和当前答案。②然后去掉第一个字符,然后往后更新,直到再次找到满足的答案,接着更新答案,比较和第一个的长度,如果是比第一个更短,更新长度和答案。③重复②的动作,直到找到了S中的末尾。


代码(Python):

  

 class Solution(object):
def minWindow(self, s, t):
"""
:type s: str
:type t: str
:rtype: str
"""
m,n = len(s),len(t)
if m == 0 or n == 0:
return ""
dn,dm = {},{}
for i in t:
if i in dn:
dn[i] += 1
else:
dn[i] = 1
i,first,last,mark,mark1 = 0,0,0,True,False
count = 0
while i < m:
if s[i] in dn:
if mark:
first,mark = i,False
if s[i] in dm:
dm[s[i]]+=1
else:
dm[s[i]] = 1
if dm[s[i]] <= dn[s[i]]:
count += 1
if count == n:
mark1 = True
last = i;break
i += 1
if not mark1:
return ""
t = first
while t < m:
if s[t] in dm:
if dm[s[t]] == dn[s[t]]:
first = t;break
else:
dm[s[t]] -= 1
t += 1
ans = [first,last]
while True:
j,k = first + 1,last + 1
tmp = s[first]
while j < m:
if s[j] in dn:
if dm[s[j]] <= dn[s[j]]:
first = j;break
else:
dm[s[j]] -= 1
j += 1
while k < m:
if s[k] == tmp:
last,t = k,first
while t < m:
if s[t] in dm:
if dm[s[t]] == dn[s[t]]:
first = t;break
else:
dm[s[t]] -= 1
t += 1
if last - first <= ans[1] - ans[0]:
ans = [first,last]
break
if s[k] in dm:
dm[s[k]] += 1
k += 1
if k == m:
break
return s[ans[0]:ans[1]+1]

转载请注明出处:http://www.cnblogs.com/chruny/p/5088501.html

[LeetCode]题解(python):076-Minimum Window Substring的更多相关文章

  1. Java for LeetCode 076 Minimum Window Substring

    Given a string S and a string T, find the minimum window in S which will contain all the characters ...

  2. LeetCode(76) Minimum Window Substring

    题目 Given a string S and a string T, find the minimum window in S which will contain all the characte ...

  3. 076 Minimum Window Substring 最小窗口子字符串

    给定一个字符串 S 和一个字符串 T,找到 S 中的最小窗口,它将包含复杂度为 O(n) 的 T 中的所有字符.示例:S = "ADOBECODEBANC"T = "AB ...

  4. Minimum Window Substring @LeetCode

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

  5. 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 ...

  6. 【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 ...

  7. leetcode76. Minimum Window Substring

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

  8. 53. Minimum Window Substring

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

  9. 刷题76. Minimum Window Substring

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

  10. [leetcode]Minimum Window Substring @ Python

    原题地址:https://oj.leetcode.com/problems/minimum-window-substring/ 题意: Given a string S and a string T, ...

随机推荐

  1. ZOJ1100 状压DP +深搜

    记得做过类似于这类题目是能够用组合数学方法来解决的,可惜淡忘了,也找不到了,看了网上的也有人提到过能够用组合公式解决,但是没人做,都是用了状压DP的方法,这个状压非常难讲清楚吧,推荐两篇 第一遍大体看 ...

  2. HDU 4914 Linear recursive sequence(矩阵乘法递推的优化)

    题解见X姐的论文 矩阵乘法递推的优化.仅仅是mark一下. .

  3. [学习笔记]viewport定义,弹性布局,响应式布局

    一,移动端宽度设置viewport视图窗口,<meta name="viewport" content="width=device-width,initial-sc ...

  4. Android基础知识巩固:关于PendingIntent和广播

    平时使用广播的场合比较多,但细节的东西,看过了也没有总结,以至于某些场合有小问题,还是要把原理和属性搞清楚才能运用自如. 其实也是自己比较懒,先看别人的blog,有个概念再去官网看英文的能好理解一些. ...

  5. JAVA编译中拒绝访问的问题及解决方案

    在java编译时出现,可以将C盘内的文件转移到其他盘,此问题可能是权限不足不能够读取C盘文件造成的. 文件名与类名要一致,包括大小写,也是要一致!

  6. MarkDown使用 (二)矩阵

    MarkDown的矩阵输入 MarkDown的矩阵输入 简单的Matrix 例如 $$ \begin{matrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ ...

  7. Mysql笔记之 -- 小试MYSQL主从配置

    mysql主从配置: 硬件: 两台服务器 1.Ubuntu 12.04.4 LTS (GNU/Linux 3.2.0-60-generic-pae i686)  2.Ubuntu 12.04.4 LT ...

  8. 使用VisualVM分析tomcat运行状况(1)

    VisualVM是一款java程序性能分析与调优工具,而且还是jdk中自带的工具之一. tomcat也是一个java程序,自然也可以用它来进行监控.不过这里还是会有些问题,tomcat有两种常用的期待 ...

  9. java调用C++ DLL库方法

    最近一个项目要开发网页端人脸识别项目,人脸识别的算法已经写好,是C++版,但是网页端要求使用Java后台,这就涉及到Java调用DLL的问题.经过查找,实现了一个简单的例子. 1.第一步,先在Java ...

  10. MySQL float 与decimal 各中的区别。

    想一个问题: 1/3+1/3+1/3=1.0 0.3+0.3+0.3 =0.9 想一想在小数的世界里要什么表示1/3呢!它的办法就是取一个与1/3十分接近的小数来代替:如上面例子中的0.3来代替1/3 ...