76. Minimum Window Substring
来源:互联网 发布:阿里云飞天 编辑:程序博客网 时间:2024/06/07 04:51
1、题目描述
输入字符串S和T,在S中找到最短子串,使得它包含了T中的所有字符。
2、思路
哈希表+Two Pointers。
用一个map来记录每个字符出现的次数。
写一个函数allzero,判断map中所有字符出现的次数都不大于0.
每当S中有一个子串满足了条件,要尽力地往右移动左边界,使得它还是满足条件,从而找出最短的子串。
复杂度O(n).
3、代码
string minWindow(string s, string t) { int l1=s.size(),l2=t.size(); if(l1<l2) return ""; map<char,int>m; for(int i=0;i<l2;i++){ m[t[i]]++; m[s[i]]--; } if(allzero(m)) return s.substr(0,l2); int ans = INT_MAX; int left = 0; int id = 0; for(int i=l2;i<l1;i++){ m[s[i]]--; while(allzero(m)){ if(ans>i-left+1){ ans = i-left+1; id=left; } m[s[left]]++; left++; } } if(ans==INT_MAX) return ""; else return s.substr(id,ans); } bool allzero(map<char,int>m){ map<char,int>::iterator it = m.begin(); for(;it!=m.end();it++) { if(it->second >0) return false; } return true; }
阅读全文