题目来源:

  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):

  

  1. class Solution(object):
  2. def minWindow(self, s, t):
  3. """
  4. :type s: str
  5. :type t: str
  6. :rtype: str
  7. """
  8. m,n = len(s),len(t)
  9. if m == 0 or n == 0:
  10. return ""
  11. dn,dm = {},{}
  12. for i in t:
  13. if i in dn:
  14. dn[i] += 1
  15. else:
  16. dn[i] = 1
  17. i,first,last,mark,mark1 = 0,0,0,True,False
  18. count = 0
  19. while i < m:
  20. if s[i] in dn:
  21. if mark:
  22. first,mark = i,False
  23. if s[i] in dm:
  24. dm[s[i]]+=1
  25. else:
  26. dm[s[i]] = 1
  27. if dm[s[i]] <= dn[s[i]]:
  28. count += 1
  29. if count == n:
  30. mark1 = True
  31. last = i;break
  32. i += 1
  33. if not mark1:
  34. return ""
  35. t = first
  36. while t < m:
  37. if s[t] in dm:
  38. if dm[s[t]] == dn[s[t]]:
  39. first = t;break
  40. else:
  41. dm[s[t]] -= 1
  42. t += 1
  43. ans = [first,last]
  44. while True:
  45. j,k = first + 1,last + 1
  46. tmp = s[first]
  47. while j < m:
  48. if s[j] in dn:
  49. if dm[s[j]] <= dn[s[j]]:
  50. first = j;break
  51. else:
  52. dm[s[j]] -= 1
  53. j += 1
  54. while k < m:
  55. if s[k] == tmp:
  56. last,t = k,first
  57. while t < m:
  58. if s[t] in dm:
  59. if dm[s[t]] == dn[s[t]]:
  60. first = t;break
  61. else:
  62. dm[s[t]] -= 1
  63. t += 1
  64. if last - first <= ans[1] - ans[0]:
  65. ans = [first,last]
  66. break
  67. if s[k] in dm:
  68. dm[s[k]] += 1
  69. k += 1
  70. if k == m:
  71. break
  72. 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. 使用sphinx索引mysql数据

    数据库表如下 mysql> select * from tb_account; +----+-------+------+ | id | name | age | +----+-------+- ...

  2. 关于SYN洪泛攻击简介

    在TCP三次握手中,server为了响应一个收到的SYN.分配并初始化连续变量和缓存.然后server发送一个SYNACK进行响应,并等待来自客户的ACK报文段. 假设某客户不发送ACK来完毕该三次握 ...

  3. HDU 5024 Wang Xifeng&#39;s Little Plot 搜索

    pid=5024">点击打开链接 Wang Xifeng's Little Plot Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  4. [置顶] PHP如何扩展和如何在linux底层对php扩展?

    虽然大部分php工程师都不需要知道php的C代码核心是如何运作的,有些人可能知道有个dl()函数.或者使用过一些第三方的类库,这些正是本文的重点之一.            希望对那些想把php带向更 ...

  5. 2.1确定一个char包含何种字符

    知识点: 1.char.IsControl 2.char.IsPunctuation 3.char.IsSurrogate 4.char.IsWhitespace 5.char.IsDigit 6.c ...

  6. 权威指南之脚本化jquery

    jqury函数 jquery()($())有4种不同的调用方式 第一种是最常用的调用方式是传递css选择器(字符串)给$()方法.当通过这种方式调用时,$()方法会返回当前文档中匹配该选择器的元素集. ...

  7. JavaScript之面向对象学习四原型对象的动态性

    1.由于在原型中查找值的过程是一次搜索,因此我们对原型对象所做的任何修改都能够立即从实例上反映出来---即便是先创建了实例后修改原型也是如此.代码如下: function Person(){ } va ...

  8. bootstrap2.3.2常用标签的使用

    <!DOCTYPE html> <html lang="zh_CN"> <head> <title>Bootstrap 101 Te ...

  9. 字符串分割--Java中String.split()用法

    转载自:http://blog.163.com/zs_note/blog/static/199386112201110804233558/ 在java.lang包中有String.split()方法, ...

  10. Java String.indexOf() 函数用法小结

    1. indexOf的参数是 String,  startIndex: Number; indexOf的返回值为int, 2. Function indexOf 包含如下几个格式:1). Strng. ...