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
原创粉丝点击