最小窗口子字符串 LEETCODE 探索提升遇到的第一个困难的题目。
2018-08-05 13:27
141 查看
最小窗口子字符串
给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串。
示例:
[code]输入: S = "ADOBECODEBANC", T = "ABC" 输出: "BANC"
说明:
- 如果 S 中不存这样的子串,则返回空字符串
""
。 - 如果 S 中存在这样的子串,我们保证它是唯一的答案
问题已经很具体了,分析ac代码。
[code]class Solution { public: string minWindow(string s, string t) { vector<int> map(128,0); for(auto c: t) map[c]++; int counter = t.size(), begin = 0, end = 0, d = INT_MAX, head = 0; while(end<s.size()){ if(map[s[end++]]-- > 0) counter--; //in t while(counter == 0){ //valid if(end - begin < d) d = end - (head = begin); if(map[s[begin++]]++ == 0) counter++; //make it invalid } } return d==INT_MAX? "":s.substr(head, d); } };
定义ascII 128 字符hash 是在字符串处理中,检测是否出现过的常用做法。
通过第一行第二行代码确定了需要包含的字符范围;我最初的想法是建立一个unorder_map 实质是一样的。
对于字符串处理这种方法更经济直观。
对于截取子串来说。 在 counter 等于零的时候 ,
end 到 begin 一定是一条包含子串,这个时候 需要判断是否是最短的子串。
长度就等 end - begin。先记录下来。 然后在改变原先的map 现在需要的是继续搜索下一串子串,头指针前移hash自加。但是问题是这样不就不知道子串是不是包含t 了么。依然是知道的。注意看if(map[s[end++]]-- > 0) counter--; //in t 这个代码。在这里map中原来为1的变成了零,但是原来没有的字符变成的是-1;在哈希中就实现了不包含的字符串就跳过了。当等于零的点在后一个循环中又出现时,说明包含的字符出现了,那么给他自加到1,而没有包含的字符从-1自加到零。counter 在自加1。跳出内层循环。同时相当于扔掉最早的出现的一个包含字符。尾部继续搜索最先出现的这个字符。
整个算法拆开来就是这样。 其中关键的有几点
主循环只走一遍,end 在循环内无脑自加,同时利用hash检测是否包含。同时又标记是否遍历过。 记录当前查找进度
内层循环 主要功能 第一记录当前找到的字符串长度,与位置。第二,丢掉最先找到的包含字符,让外循环继续寻找这个字符在尾部。
阅读更多
相关文章推荐
- LeetCode 高级 - 最小窗口子字符串
- No17、题目:在一个字符串中找到第一个只出现一次的字符。如输入 abaccdeff,则输出 b。
- leetcode 632. Smallest Range k个数组至少一个元素最小区间+典型移动窗口做法
- 【程序35】 ArrayChange.java 题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
- 【LeetCode题目记录-3】字符串中最长的没有重复字符的子串
- [LeetCode] 712. Minimum ASCII Delete Sum for Two Strings 两个字符串的最小ASCII删除和
- 在字符串中删除特定的字符(字符串)。 题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。 例如,输入”They are students.”和”aeiou”, 则删除之后的第一个字符串
- 【leetcode】 字符串中的第一个唯一字符
- leetcode-字符串中的第一个唯一字符
- LeetCode 387. First Unique Character in a String (字符串中的第一个唯一字符)
- 第17 题:题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。
- [LeetCode] Minimum Window Substring 最小窗口子串
- 给定字符串S和字符串T,找到S中的最小窗口,其中将包含复杂度O(n)中T中的所有字符。
- 华为OJ题目(一):找出字符串中第一个出现一次的字符
- 几个字符串相关的题目,来自LeetCode和LintCode
- leetcode -- Simplify Path -- 字符串处理的题目
- 微软面试100题目之17 :在一个字符串中找到第一个只出现一次的字符。
- Submission Details (两个字符串的最小距离)【leetcode】
- LeetCode:找出字符串中第一个只出现一次的字符
- [LeetCode] 76. Minimum Window Substring 最小窗口子串