leetcode 76 Minimum Window Substring

题意:给俩字符串s和t,问s里最短的包含t的全部字符的子串是啥。

解法:尺取法。用tnum数组记录每个字符出现次数,用num记录当前取的这段每个字符出现次数,看是不是每个字符的出现次数都够了,够了就挪左指针不够就挪右指针

tag上写的hash和尺取……其实一直不太懂hash……自己感觉跟hash没什么关系……看了别人的解释好像是说用数组记录出现次数算hash?orz

还有这两天刷了leetcode之后觉得奇怪,为什么java的运行速度比c++高呢?这不科学啊

代码:

class Solution {
public:
    bool judge(int tnum[], int num[]) {
        for(int i = 0; i < 256; i++) {
            if(tnum[i] > num[i]) return false;
        }
        return true;
    }
    string minWindow(string s, string t) {
        int tnum[256] = {0}, num[256] = {0};
        int len = INT_MAX;
        int ansi = -1, ansj = -1;
        for(int i = 0; i < t.size(); i++) {
            tnum[t[i]]++;
        }
        int i, j = 0;
        for(i = 0; i < s.size(); i++) {
            num[s[i]]++;
            while(judge(tnum, num)) {
                if(i - j + 1 < len) {
                    ansi = i;
                    ansj = j;
                    len = i - j + 1;
                }
                num[s[j]]--;
                j++;
            }
        }
        return ansi == -1 ? "" : s.substr(ansj, ansi - ansj + 1);
    }
};

  既然tag里说是hash那我就分类成hash吧【XD

原文地址:https://www.cnblogs.com/Apro/p/5201183.html