题目来源
题目描述
题目解析
思路:
- 先对A[]、B[]进行预处理,生成C[] ,其中 C[i] = std::abs(A[i] - B[i]);
- 然后我们只看C,这样问题就转换为: C中找出子串之和<= V的最长子串的长度
- 因为C一定是正数,所以它具备二段线,可以用滑动窗口来做,或者动态规划(用前缀和数组来优化)
#include <iostream>
#include <utility>
#include <vector>
#include <random>
#include <iterator>
#include <map>
#include <algorithm>
#include <set>
#include <bitset>
#include <queue>
#include <iostream>
using namespace std;
class Solution{
int subSumLength(std::vector<int> &C, int k){
int sum = 0, ans = 0;
int i = 0, j = 0; // i指向下一个待移除的元素, j指向当前正在看的元素
while (j < C.size()){
sum += C[j]; // 窗口[i, j]一定满足要求
if(sum > k){ // 当窗口不满足要求
// 移动i令 [i, j]重新符合要求
while (i <= j && sum > k){
sum -= C[i];
i++;
}
}
ans = std::max(ans, j - i + 1);
j++;
}
return ans;
}
public:
int process(std::string &A, std::string &B, int K){
int N = A.size();
std::vector<int> arr(N, 0);
for (int i = 0; i < N; ++i) {
arr[i] = std::abs(A[i] - B[i]);
}
return subSumLength(arr, K);
}
};
int main(){
std::string A;
std::string B;
int K ;
std::cin >> A;
std::cin >> B;
std::cin >> K;
Solution a;
std::cout << a.process(A, B, K);
return 0;
}
思路:暴力枚举
- 枚举每一个i作为起点
- 什么样的i能作为起点呢?当std::abs(a[i] - b[i]) <=v时。
- 然后求以当前位置作为起始位置的符号条件的最长子串长度