3298. 统计重新排列后包含另一个字符串的子字符串数目 II
题目链接:3298. 统计重新排列后包含另一个字符串的子字符串数目 II
代码如下:
class Solution {
public:
long long validSubstringCount(string word1, string word2) {
if (word1.size() < word2.size()) {
return 0;
}
int diff[26]{};//word1的字母出现次数与word2的字母出现次数之差
for (char c : word2) {
diff[c - 'a']++;
}
//统计窗口内有多少个字母的出现次数比t的少
int less = 0;
for (int d : diff) {
if (d > 0) {
less++;
}
}
long long res = 0;
int left = 0;
for (char c : word1) {
diff[c - 'a']--;
if (diff[c - 'a'] == 0) {
//c移入窗口后,窗口类c的出现次数和t的一样
less--;
}
while (less == 0) {//窗口符合要求
char out_char = word1[left++] - 'a';//准备移出窗口的字母
if (diff[out_char] == 0) {
//out_char 移出窗口之前,检查出现次数
//如果窗口内out_char的出现次数与t的一样
//那么out_char移出窗口后,窗口内out_char的出现次数比word2的少
less++;
}
diff[out_char]++;
}
res += left;
}
return res;
}
};