[LeetCode] Minimum Window Substring 散列映射问题
题目:
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.
Hash Table Two Pointers String
- T 中的字符可以重复,窗口需要重复包含。
- 测试 实验中的是SCII字符 ,所以可以用128位数组代替 hash table。
- leetcode c++ 中不能用 hash_map。
思路:
- 使用一个映射int need(hash table 或者 128位数组) 存储T中个字符需要的个数,因为需求可能为负,所以用int。
- 使用一个映射bool exitst(hash table 或者 128位数组) 存储T中个字符是否存在,使用hashtable 也构造这个,因为find 是遍历查找的。
- 用一个var 记录窗口中符合T 中char 的个数。
- 用下表start、last 标记窗口位置,start 指向窗口内第一个char,last 指向窗口外右边第一个char(包括结尾)。
- 每次循环加入或删除(记录一个flag)一个字符,如果不存在便继续循环。
- 通过判断加入删除flag进行操作,更新need 表,更新var, 如果等于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
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 散列映射问题相关推荐
- LeetCode - Minimum Window Substring
题目: Given a string S and a string T, find the minimum window in S which will contain all the charact ...
- Minimum Window Substring @LeetCode
不好做的一道题,发现String Algorithm可以出很多很难的题,特别是多指针,DP,数学推导的题.参考了许多资料: http://leetcode.com/2010/11/finding-mi ...
- 【打印代码+好好理解+子串问题】LeetCode 76. Minimum Window Substring
LeetCode 76. Minimum Window Substring 字符串子串问题!!!理解这题真是花了很大的功夫!!! 参考链接:https://blog.csdn.net/weixin_4 ...
- LeetCode 76. Minimum Window Substring / 567. Permutation in String
76. Minimum Window Substring 典型Sliding Window的问题,维护一个区间,当区间满足要求则进行比较选择较小的字串,重新修改start位置. 思路虽然不难,但是如何 ...
- 字符串关键字的散列映射 (25 分)【详细解析】
立志用最少的代码做最高效的表达 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位:再用除留余数法将整数映射 ...
- 7-43 字符串关键字的散列映射 (25 分)(思路+详解+不懂的兄弟们来呀)兄弟们我干了5个小时,一个一个测试点过的
一:题目 7-43 字符串关键字的散列映射 (25 分) 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位 ...
- PTA字符串关键字的散列映射 (哈希表)
给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位:再用除留余数法将整数映射到长度为P的散列表中.例如将字符 ...
- 字符串关键字的散列映射
7-14 字符串关键字的散列映射 (25 分) 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位:再用除留 ...
- 案例5-1.4 字符串关键字的散列映射 (25分)(数据结构)(C语言实现)
给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位:再用除留余数法将整数映射到长度为P的散列表中.例如将字符 ...
最新文章
- iOS 十六进制的颜色值转换为UIColor
- 通过pipeline实现jenkins的ci/cd功能
- 关于网络编程中MTU、TCP、UDP、IP
- JAVA中this用法小结
- Python字符串的定义与常用操作
- Serverless Devs 2.0 开箱测评:Serverless 开发最佳实践
- 任女尔(1990-),女,北京卡达克数据技术中心软件业务本部助理工程师,主要研究方向为大数据、云计算。...
- PHP算法 参数组合,多个分类不同组合列表
- BAT解密:互联网技术发展之路(2)- 业务如何驱动技术发展
- 只有360浏览器能打开别的都打不开
- 【新书推荐】大唐的裂变(套装共5册)(王澄明等著)
- linux uid gid 作用,Linux uid和gid
- 这是一篇系统的追热点方法论
- Java体系十大组织
- 学习C++在windows下窗口应用程序开发(一)
- 高德地图手机端定位偏移问题
- SQL Server - 数据库(创建,修改管理-删除)-T-SQL 语句
- Bladed 时序风况配置方法
- Matlab中switch, case, otherwise语句
- python爬小说代码_中文编程,用python编写小说网站爬虫
热门文章
- python输出图像plt_Matplotlib(pyplot)savefig输出空白图像
- java拉起服务,从Java调用Restful服务
- `json in遍历
- 上海羽毛球场预定app_生意火爆一席难求!普陀这家“羽毛球场”原来竟是……...
- 模板使用自定义类型_自定义虚幻图表_拓展蓝图功能
- 米家扫地机器人重置网络_谁家扫地机器人悄声打扫更干净,科沃斯DEEBOT N3对比米家1S...
- zb怎么做渲染图_怎样用ZBrush对模型进行渲染(二)
- python第一个公开发行版_python之基础篇(一)
- 系统学习深度学习(四十三)--GAN简单了解
- python 语法提示_Python 语法提示vim配置