领扣 76. 最小覆盖子串

给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串。

示例:

输入: S = “ADOBECODEBANC”, T = “ABC”
输出: “BANC”

说明:
如果 S 中不存这样的子串,则返回空字符串 “”。
如果 S 中存在这样的子串,我们保证它是唯一的答案。

我的代码 8ms

struct Index_char
{
    int index;
    char c;
    Index_char(){}
    Index_char(int i,char j){index=i;c=j;}
};
class Solution {
public:
    string minWindow(string s, string t) {
        int hash[128]={0};
        int had_match=0;
        queueque;
        int temp_hash[128]={0};
        int min_length=s.size()+2;
        int queue_hash[128]={0};//代表队列有几个字符
        string solution;
        for(int i=0;ihash[c])
                        {
                            que.pop();
                            queue_hash[c]--;
                        }
                        else
                            break;
                    }
                }
            }
            else if(temp_hash[s[i]]==hash[s[i]]&&hash[s[i]]!=0)
            {
                Index_char temp(i,s[i]);
                que.push(temp);
                if(que.front().c==s[i])
                {
                    que.pop();
                    while(!que.empty())
                    {
                        char c=que.front().c;
                        if(queue_hash[c]>hash[c])
                        {
                            que.pop();
                            queue_hash[c]--;
                        }
                        else
                            break;
                    }
                }
                else
                    queue_hash[s[i]]++;
            }
        }
        return solution;
    }
};

网上的代码 8ms

class Solution {
public:
    string minWindow(string s, string t) {
        vector m(128, 0);
        for (auto c : t) m[c]++;
        int count = t.size(), begin = 0, end = 0, d = s.size()+2, head = 0;
        bool isok=false;
        while (end < s.size()) 
        {
            if (m[s[end]]> 0) 
                count--;
            m[s[end]]-- ;
            
            if(count == 0)
            {
                isok=true;
                while(m[s[begin]]!=0)
                {
                    m[s[begin]]++;
                    begin++;
                }
                if (end - begin +1< d) 
                {
                    head = begin;
                    d = end - begin+1; 
                }
                m[s[begin]]++;
                count++;
                begin++;
            }
            end++;
    
        }
        if(isok==false) return "";
        return s.substr(head, d);
    }
};

你可能感兴趣的:(领扣)