LeetCode76——Minimum Window Substring
2015-11-17 20:59
369 查看
LeetCode76——Minimum Window Substring
以前似乎做过类似的,点了LeetCode类似题想起来了(这点把不同类型的题目分类真心不错)好了,跟LeetCode30——Substring with Concatenation of All Words很相似,需要维护一个Map。
当时做这题的时候就感觉自己做得非常不智能,有点像朴素的字符串的模式匹配,效率比较低。
做这题的时候也比较吃力。
言归正传。
--------------------------------------------------------------------------------------------
这题的意思是:
从母串S中找到这样一个子串W,这个子串包含目标T串中的所有字符,并且该子串的长度最短。
思路:
维护两个索引Start 和 End(初值都为0),分别标识 子串W(这里表示Window)的开始位置和结束位置。
下面关键就是判断何时这两个索引要变化。
1.首先如果没有找到map中的单词,End++,继续往后找。
2.如果map中的字母还没找完,且找到了当前字母,则map中当前单词对应的value--(表示找到一个)。
3.当然可能有重复字母,即value减为负了,这样找出来的window包含多余重复字母肯定不是最优,所以我们要记录找到字母个数。
4.一旦找满单词,这个时候Start到End的位置肯定是包含目标T串所有字符的子串W(即Window)
5.但是这个window不是最优的,我们要对start++,排除不在map中的字符(其实就是让Start越过步骤1中跳过的字符),缩小window大小
6.还有需要优化的地方,就是当window中出现重复的字符,这时,map中该字符的value为负了,我们可以向前移动start。
关于第6点,比如说:
母串ABCDDDDDDDA
目标串ABC
那么当End移动到最后一个A时,Start只能停在第一个A处(为了保证Window中包含ABC三个字母)
而当End移动到最后一个A时,此时Window中多一个A(Map中A的值减为负了),这个时候Start就可以往前移动一下,做一步优化。
根据上述6点,代码就很容易了:
class Solution{ public: string minWindow(string s, string t){ if(s.size()<t.size()) return ""; map<char, int>chrMap;//保存最初的字母 for (int i = 0; i < t.size(); i++) { chrMap[ t[i] ]++; } int start = 0; int end = 0; int count = 0;//window中包含所需字符的数量 int minWindowLen = INT_MAX; int curWindow;//当前window大小 int minStart = 0;//当前window最小值时start的位置 int minEnd = 0;//当前window最小值时end的位置 map<char, int>tempMap(chrMap.begin(), chrMap.end());//临时map,用于计算 while (end < s.size()) { if (tempMap.find(s[end]) == tempMap.end()) { end++; continue; } tempMap[s[end]]--; if (tempMap[s[end]] >= 0) count++; if (count == t.size())//找满一次窗口 { while (start != end) { if (chrMap.find(s[start]) == chrMap.end())//start不在T的map里面 { start++; continue; } if (tempMap[s[start]] < 0)//window中对于同一字符找重了,此时要向前移动并且补上 { tempMap[s[start]]++; start++; continue; } else break; } curWindow = end - start + 1; //curWindow = min(curWindow, minWindowLen); if (curWindow < minWindowLen) { minWindowLen = curWindow; minStart = start; minEnd = end; } } end++; } if (minWindowLen == INT_MAX) return ""; return s.substr(minStart, minWindowLen); } };
相关文章推荐
- iOS网络(Swift)
- 为你的drawable图片添加监听事件----drawableRight增加监听事件
- python中的eval函数
- linux下c++读文件夹下的文件及文件夹笔记
- Ubuntu 14.04 安装 flash插件
- 点滴积累【other】---HTTP 错误 404.13 - Not Found,请求筛选模块被配置为拒绝超过请求内容长度的请求(转载)
- Android SystemProperties设置/取得系统属性的用法总结
- C#实现各种格式文件的复制
- JavaScript中清空数组的三种方式
- android Activity的生命周期
- BZOJ 1061 [Noi2008]志愿者招募
- 链表中倒数第k个结点
- 【UML总结】——用例图
- HEVC算法和体系结构:编码框架
- 中序表达式转后序表达式(带括号)
- .a与.so区别
- HEVC算法和体系结构:编码框架
- vxworks入门
- C#在控制台获取应用程序的路径
- UEFI的helloworld程序