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