classIWindow {
public:virtualvoid add(int num) =0;
virtualvoiderase(int num) =0;
virtualboolcheck() =0;
virtual~IWindow() {}
};
classWindow:public IWindow {
private:int _maxCost;
int _curr =0;
public: Window(int maxCost): _maxCost(maxCost) {}
voidadd(int num) override {
_curr += num;
}
voiderase(int num) override {
_curr -= num;
}
boolcheck() override {
return _curr > _maxCost;
}
};
classSolution {
private: unique_ptr<IWindow> _w;
public:int equalSubstring(string s, string t, int maxCost) {
auto nums = [&](int i) ->int {
returnabs(s[i] - t[i]);
};
_w = make_unique<Window>(maxCost);
int n = s.size(), left =0, right =0;
int res =0;
while (right < n) {
_w->add(nums(right++));
while (_w->check()) _w->erase(nums(left++));
res = max(res, right - left);
}
return res;
}
};
簡易版
classSolution {
public:int equalSubstring(string s, string t, int maxCost) {
int curr =0;
int n = s.size(), left =0, right =0;
int res =0;
while (right < n) {
curr += abs(s[right] - t[right]);
right++;
while (curr > maxCost) {
curr -= abs(s[left] - t[left]);
left++;
}
res = max(res, right - left);
}
return res;
}
};