题意:
https://oj.leetcode.com/problems/minimum-window-substring/
思路:
sliding window,two pointer,尺取法。。
#include<bits/stdc++.h>
using namespace std;
#define SPEED_UP iostream::sync_with_stdio(false);
#define FIXED_FLOAT cout.setf(ios::fixed, ios::floatfield);
#define rep(i, s, t) for(int (i)=(s);(i)<=(t);++(i))
#define urep(i, s, t) for(int (i)=(s);(i)>=(t);--(i))
#define in_bound(l, r, i) (l)<=(i)&&(i)<(r)
#define pb push_back
typedef long long LL;
const int inf = INT_MAX/2;
const int Maxn = 1000;
class Solution {
public:
int sm[256], tm[256];
int check() {
rep(i, 0, 255)
if (sm[i] < tm[i]) return 0;
return 1;
}
string minWindow(string S, string T) {
memset(sm, 0, sizeof(sm));
memset(tm, 0, sizeof(tm));
int sn = S.length(), tn = T.length();
rep(i, 0, tn-1) tm[T[i]] += 1;
int l = 0, r = 0;
sm[S[0]] = 1;
int ans = inf;
string ret = "";
while (l <= r) {
int ok = check();
if (ok) {
if (r-l+1 < ans) {
ans = r-l+1;
ret = S.substr(l, ans);
}
sm[S[l]] -= 1;
++l;
}
else {
if (r < sn-1) {
++r;
sm[S[r]] += 1;
}
else
break;
}
}
return ret;
}
};