Leetcode: Minimum Window Substring
来源:互联网 发布:福田网络布线 编辑:程序博客网 时间:2024/06/03 23:38
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.
双指针的思想,先找到一个包含T的窗口,然后在满足条件(包含T)的情况下向后移动头指针,如果不能再移动则继续移动尾指针。这里用一个计数器统计字符串S中字符串T内字符出现的次数 - 可以是重复字符,只要总次数小于T中的重复次数 - 如果等于T的长度表明已经包含T。
class Solution {public: string minWindow(string S, string T) { int chars_to_find[256] = {0}; for (int i = 0; i < T.size(); ++i) { ++chars_to_find[T[i]]; } int ret, minlen = S.size() + 1; int count = 0; int has_found[256] = {0}; for (int i = 0, start = 0; i < S.size(); ++i) { if (chars_to_find[S[i]] == 0) { continue; } ++has_found[S[i]]; if (has_found[S[i]] <= chars_to_find[S[i]]) { ++count; } if (count == T.size()) { // have found all the characters in T while (chars_to_find[S[start]] == 0 || has_found[S[start]] > chars_to_find[S[start]]) { if (has_found[S[start]] > chars_to_find[S[start]]) { --has_found[S[start]]; } ++start; } if (i - start + 1 < minlen) { ret = start; minlen = i - start + 1; } } } return minlen == S.size() + 1 ? "" : S.substr(ret, minlen); }};
====================第二次===================
第二次也写了一个半小时啊。。。
class Solution {public: string minWindow(string S, string T) { int expected_chars[256] = {0}; int total_count = T.size(); for (int i = 0; i < total_count; ++i) { ++expected_chars[T[i]]; } int found_count = 0; int found_chars[256] = {0}; int min_length = S.size() + 1; int min_start = -1; for (int i = 0, start = 0; i < S.size(); ++i) { if (expected_chars[S[i]] == 0) { continue; } ++found_chars[S[i]]; if (found_chars[S[i]] <= expected_chars[S[i]]) { ++found_count; while (found_count == total_count) { while (expected_chars[S[start]] == 0) { ++start; } int length = i - start + 1; if (length < min_length) { min_length = length; min_start = start; } --found_chars[S[start]]; if (found_chars[S[start]] < expected_chars[S[start]]) { --found_count; } ++start; } } } return min_start == -1 ? "" : S.substr(min_start, min_length); }};
0 0
- LeetCode: Minimum Window Substring
- LeetCode Minimum Window Substring
- LeetCode : Minimum Window Substring
- [LeetCode] Minimum Window Substring
- [Leetcode] Minimum Window Substring
- LeetCode: Minimum Window Substring
- [LeetCode]Minimum Window Substring
- [leetcode]Minimum Window Substring
- Leetcode:Minimum Window Substring
- LeetCode-Minimum Window Substring
- [leetcode] Minimum Window Substring
- [leetcode] Minimum Window Substring
- leetcode Minimum Window Substring
- [LeetCode] Minimum Window Substring
- [LeetCode] Minimum Window Substring
- leetcode minimum window substring
- LeetCode - Minimum Window Substring
- LeetCode:Minimum Window Substring
- EAS客户端登录windows server 2008上EAS服务端的端口问题。
- IsPostBack原理
- 我问你,java中的标记接口(Marker interface pattern)有啥用?
- Wow, Mangos登录时的SRP6认证
- 设计模式
- Leetcode: Minimum Window Substring
- 结构体内存对齐问题
- JBoss 系列九十三: 高性能非阻塞 Web 服务器 Undertow
- arm-linux-gcc交叉编译器的下载地址
- C/C++中##与#的使用
- 致终将逝去的Windows XP
- 一个strcpy 的溢出例子
- 生成一个集合的所有子集 Subset
- 编写ATL控件的简单做法