zoukankan      html  css  js  c++  java
  • Minimum Window Substring

    Description:

    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.

    Code:

    struct record
    {
        int start, end, length;
        record(){
            start=end=length = 0;
        }
    };
    class Solution {
    public:
        bool isWindowContainT(int * win, int * ch_t)
        {
            for (int i = 0; i < 256; ++i)
            {
                if (win[i] < ch_t[i])
                    return false;
            }
            return true;
        }
        string minWindow(string s, string t) {
            unsigned int lengthS = s.size();
            unsigned int lengthT = t.size();
            if (lengthT > lengthS)
                return "";
                
            int ch_t[256], ch_win[256];
            for (int i = 0; i < 256; ++i)
            {
                ch_t[i] = 0;
                ch_win[i] = 0;
            }
            for (int i = 0; i < lengthT; ++i)
                ch_t[t[i]]++;
                
            int start = 0, end = 0;
            ch_win[s[0]]=1;
            record min;
            min.length = INT_MAX;
            bool flag = false;
            while (end < lengthS)
            {
                if ( isWindowContainT(ch_win, ch_t) )
                {
                     flag = true;
                    if (end-start+1 < min.length)
                    {
                        min.start = start;
                        min.end = end;
                        min.length = end-start+1;
                    }
                    ch_win[s[start]]--;
                    start++;
                }
                else
                {
                    ch_win[s[++end]]++;
                }
            }
            if (flag)
                return s.substr(min.start, min.end-min.start+1);
            else
                return "";
        }
    };

    注意:T中允许字符重复

    思路:双指针,动态维护一个区间。尾指针不断往后扫,当扫到有一个窗口包含了所有T的字符后,然后再收缩头指针,直到不能再收缩为止。最后记录所有可能的情况中窗口最小的

  • 相关阅读:
    感悟优化——Netty对JDK缓冲区的内存池零拷贝改造
    由浅入深理解Java线程池及线程池的如何使用
    Http学习笔记
    zookeeper集群配置详细教程
    kafka学习笔记——基本概念与安装
    干货——详解Java中的关键字
    Java基础巩固——排序
    你可以这么理解五种I/O模型
    Java中的NIO基础知识
    Java基础巩固——异常
  • 原文地址:https://www.cnblogs.com/happygirl-zjj/p/4778667.html
Copyright © 2011-2022 走看看