题目:


Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).

For example,
S = "ADOBECODEBANC"
T = "ABC"

Minimum window is "BANC".

Note:
If there is no such window in S that covers all characters in T, return the emtpy string "".

If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.

Hide Tags

Hash Table Two Pointers String


在字符串 S 中查找最小的窗口,使窗口中全部包含字符串T 中的字符,(不按顺序),需要注意的地方:
  • T 中的字符可以重复,窗口需要重复包含。
  • 测试 实验中的是SCII字符 ,所以可以用128位数组代替 hash table。
  • leetcode  c++ 中不能用 hash_map。

思路:

  1. 使用一个映射int need(hash table 或者 128位数组) 存储T中个字符需要的个数,因为需求可能为负,所以用int。
  2. 使用一个映射bool exitst(hash table 或者 128位数组) 存储T中个字符是否存在,使用hashtable 也构造这个,因为find 是遍历查找的。
  3. 用一个var 记录窗口中符合T 中char 的个数。
  4. 用下表start、last 标记窗口位置,start 指向窗口内第一个char,last 指向窗口外右边第一个char(包括结尾)。
  5. 每次循环加入或删除(记录一个flag)一个字符,如果不存在便继续循环。
  6. 通过判断加入删除flag进行操作,更新need 表,更新var, 如果等于T 的长度,更新返回记录。
  7. 循环结束判断能否查找。
下面是我写的,需要的时间复杂度为O(length(S)),即O(n),空间复杂度为O(length(T)):

 1 #include <string>
 2 #include <hash_map>
 3 #include <iostream>
 4 #include <map>
 5 using namespace std;
 6 using namespace __gnu_cxx;
 7
 8 class Solution {
 9 public:
10     string minWindow(string S, string T) {
11         int numS = S.length(),numT = T.length();
12         if(numS<1||numT<1)    return "";
13         int WinStart=0,WinLast=0,WinCount =0,retStart,leng=INT_MAX;
14         hash_map<char, int > need;
15         hash_map<char, bool > exist;
16         for(int i =0;i<numT;i++){
17             need[T[i]]++;
18             exist[T[i]] = true;
19         }
20
21         bool addorminus;
22         char curchar;
23         while(WinStart<=numS-numT){
24             if(WinCount!=numT&&WinLast<numS){
25                 addorminus = true;
26                 curchar = S[WinLast++];
27             }
28             else{
29                 addorminus = false;
30                 curchar = S[WinStart++];
31             }
32             if(!exist[curchar]) continue;
33             if(addorminus){
34                 if(need[curchar]>0)  WinCount++;
35                 need[curchar]--;
36                 if(WinCount==numT&&leng>WinLast - WinStart){
37                     retStart = WinStart;
38                     leng = WinLast - WinStart;
39                 }
40             }
41             else{
42                 if(WinCount==numT&&leng>WinLast - WinStart+1){
43                     retStart = WinStart-1;
44                     leng = WinLast - WinStart+1;
45                 }
46                 need[curchar] ++;
47                 if(need[curchar]>0)  WinCount--;
48             }
49         }
50         if(leng==INT_MAX)
51             return "";
52         return S.substr(retStart,leng);
53     }
54 };
55
56 int main()
57 {
58     string s = "1A123BAC1";
59     string t = "AABC";
60     Solution sol;
61
62     string ret = sol.minWindow(s,t);
63     cout<<ret<<endl;
64     return 0;
65 }

View Code

leetcode 讨论里面有另外一个实现,也是O(n),实现类似,不同的是循环内是通过判断窗口中已经有T中字符的个数来进行 add or delete,我写的是通过目标操作字符来进行,逻辑上没有ta写的方便。
https://oj.leetcode.com/discuss/10337/accepted-o-n-solution

 1 class Solution {
 2 public:
 3     string minWindow(string S, string T) {
 4         if (S.empty() || T.empty())
 5         {
 6             return "";
 7         }
 8         int count = T.size();
 9         int require[128] = {0};
10         bool chSet[128] = {false};
11         for (int i = 0; i < count; ++i)
12         {
13             require[T[i]]++;
14             chSet[T[i]] = true;
15         }
16         int i = -1;
17         int j = 0;
18         int minLen = INT_MAX;
19         int minIdx = 0;
20         while (i < (int)S.size() && j < (int)S.size())
21         {
22             if (count)
23             {
24                 i++;
25                 require[S[i]]--;
26                 if (chSet[S[i]] && require[S[i]] >= 0)
27                 {
28                     count--;
29                 }
30             }
31             else
32             {
33                 if (minLen > i - j + 1)
34                 {
35                     minLen = i - j + 1;
36                     minIdx = j;
37                 }
38                 require[S[j]]++;
39                 if (chSet[S[j]] && require[S[j]] > 0)
40                 {
41                     count++;
42                 }
43                 j++;
44             }
45         }
46         if (minLen == INT_MAX)
47         {
48             return "";
49         }
50         return S.substr(minIdx, minLen);
51     }
52 };

View Code

转载于:https://www.cnblogs.com/Azhu/p/4127606.html

[LeetCode] Minimum Window Substring 散列映射问题相关推荐

  1. LeetCode - Minimum Window Substring

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

  2. Minimum Window Substring @LeetCode

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

  3. 【打印代码+好好理解+子串问题】LeetCode 76. Minimum Window Substring

    LeetCode 76. Minimum Window Substring 字符串子串问题!!!理解这题真是花了很大的功夫!!! 参考链接:https://blog.csdn.net/weixin_4 ...

  4. LeetCode 76. Minimum Window Substring / 567. Permutation in String

    76. Minimum Window Substring 典型Sliding Window的问题,维护一个区间,当区间满足要求则进行比较选择较小的字串,重新修改start位置. 思路虽然不难,但是如何 ...

  5. 字符串关键字的散列映射 (25 分)【详细解析】

    立志用最少的代码做最高效的表达 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位:再用除留余数法将整数映射 ...

  6. 7-43 字符串关键字的散列映射 (25 分)(思路+详解+不懂的兄弟们来呀)兄弟们我干了5个小时,一个一个测试点过的

    一:题目 7-43 字符串关键字的散列映射 (25 分) 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位 ...

  7. PTA字符串关键字的散列映射 (哈希表)

    给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位:再用除留余数法将整数映射到长度为P的散列表中.例如将字符 ...

  8. 字符串关键字的散列映射

    7-14 字符串关键字的散列映射 (25 分) 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位:再用除留 ...

  9. 案例5-1.4 字符串关键字的散列映射 (25分)(数据结构)(C语言实现)

    给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位:再用除留余数法将整数映射到长度为P的散列表中.例如将字符 ...

最新文章

  1. iOS 十六进制的颜色值转换为UIColor
  2. 通过pipeline实现jenkins的ci/cd功能
  3. 关于网络编程中MTU、TCP、UDP、IP
  4. JAVA中this用法小结
  5. Python字符串的定义与常用操作
  6. Serverless Devs 2.0 开箱测评:Serverless 开发最佳实践
  7. 任女尔(1990-),女,北京卡达克数据技术中心软件业务本部助理工程师,主要研究方向为大数据、云计算。...
  8. PHP算法 参数组合,多个分类不同组合列表
  9. BAT解密:互联网技术发展之路(2)- 业务如何驱动技术发展
  10. 只有360浏览器能打开别的都打不开
  11. 【新书推荐】大唐的裂变(套装共5册)(王澄明等著)
  12. linux uid gid 作用,Linux uid和gid
  13. 这是一篇系统的追热点方法论
  14. Java体系十大组织
  15. 学习C++在windows下窗口应用程序开发(一)
  16. 高德地图手机端定位偏移问题
  17. SQL Server - 数据库(创建,修改管理-删除)-T-SQL 语句
  18. Bladed 时序风况配置方法
  19. Matlab中switch, case, otherwise语句
  20. python爬小说代码_中文编程,用python编写小说网站爬虫

热门文章

  1. python输出图像plt_Matplotlib(pyplot)savefig输出空白图像
  2. java拉起服务,从Java调用Restful服务
  3. `json in遍历
  4. 上海羽毛球场预定app_生意火爆一席难求!普陀这家“羽毛球场”原来竟是……...
  5. 模板使用自定义类型_自定义虚幻图表_拓展蓝图功能
  6. 米家扫地机器人重置网络_谁家扫地机器人悄声打扫更干净,科沃斯DEEBOT N3对比米家1S...
  7. zb怎么做渲染图_怎样用ZBrush对模型进行渲染(二)
  8. python第一个公开发行版_python之基础篇(一)
  9. 系统学习深度学习(四十三)--GAN简单了解
  10. python 语法提示_Python 语法提示vim配置