dp思路,二维数组分别记录B字符串前i个字符中a和b出现的次数
遍历字符串A,两个字符串每位的不同个数等同于对应dp数组前i个的b/a数量
而在i>a.length()-b.length()的时候还要减去相应溢出导致的前几个b/a个数。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
string a, b;
cin >> a;
cin >> b;
int n = a.length() - b.length() + 1;
vector<vector<int>> dp(b.length(), vector<int>(2));
if (b[0] == 'a') dp[0][0] = 1;
else dp[0][1] = 1;
for (int i = 1; i < b.length(); i++) {
dp[i][0] = dp[i - 1][0];
dp[i][1] = dp[i - 1][1];
if (b[i] == 'a') dp[i][0]++;
if (b[i] == 'b') dp[i][1]++;
}
int sum = 0;
for (int i = 0; i < a.length(); i++) {
int end = i > b.length()-1 ? b.length()-1 : i;
if (a[i] == 'a') sum += dp[end][1];
if (a[i] == 'b') sum += dp[end][0];
if (a.length() - i < b.length()) {
int start = b.length() - (a.length() - i + 1);
if (a[i] == 'a') sum -= dp[start][1];
if (a[i] == 'b') sum -= dp[start][0];
}
}
cout << sum;
system("pause");
return 0;
}