题意:给俩字符串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