zoukankan      html  css  js  c++  java
  • LeetCode OJ--Minimum Window Substring ***

    https://oj.leetcode.com/problems/minimum-window-substring/

    模拟题

    这道题细节比较多。从左到右扫一遍模拟着做

     class Solution {
    public:
        string minWindow(string S, string T) {
            string ans = "";
            if(S.size() < T.size() )
                return ans;
            
            unordered_map<char,int> count;
            unordered_set<char> charInT;
            unordered_map<char,int> countT;
            
            for(int i = 0; i < T.size(); i++)
            {
                charInT.insert(T[i]);
                countT[T[i]]++;
            }
            
            int ansI = 0, ansJ = 0;
            // 先找第一个合法的
            for(int i = 0; i < S.size(); i++)
            {
                if(charInT.find(S[i]) != charInT.end())
                {
                    count[S[i]]++;
                    // 如果都找到了
                    if(count.size() == countT.size())
                    {
                        bool flag = true;
                        for(unordered_map<char,int>::iterator itr = countT.begin(); itr != countT.end(); itr++)
                        {
                            if(itr->second > count[itr->first])
                                flag = false; // 还没都匹配
                        }
                        if(flag)
                        {
                            ansJ = i;
                            ans = S.substr(ansI,ansJ+1);
                            break;
                        }
                    }
                }
            }
            // 往后遍历
            for(int m = 0; m < S.size(); m++)
            {
                if(charInT.find(S[m]) == charInT.end())
                    ansI++; // 往前走1个是安全的
                else 
                {
                    count[S[m]]--;
                    if(count[S[m]] >= countT[S[m]])
                        ansI++;
                    else
                    {
                        if(ans.size() > ansJ - m + 1)
                            ans = S.substr(m,ansJ - m +1);
                        // find new end
                        int temp = ansJ;
                        temp++;
                        while(temp<S.size() && S[temp] != S[m])
                        {
                            if(charInT.find(S[temp]) != charInT.end())
                                count[S[temp]]++; // 记录新加进来了合法的
                            temp++;
                        }
                        if(temp == S.size()) // 到了最后也没找到
                        {
                            return ans;
                        }
                        else
                        {
                            ansJ = temp;
                            count[S[temp]]++;
                        }
                    }
                }
            }
        }
    };
  • 相关阅读:
    扩展方法使用
    mac学习笔记:brew 安装nginx
    Mac SVN 命令行
    mac终端命令大全
    mac学习笔记之:使用brew安装软件
    Linux学习笔记之更新yum安装最新Nginx+Php
    pyenv快速入门
    pycharm配置robotframework环境(mac版)
    macOS的zsh和bash切换
    robotframework windows环境和mac环境安装教程
  • 原文地址:https://www.cnblogs.com/qingcheng/p/3917576.html
Copyright © 2011-2022 走看看