3297. 统计重新排列后包含另一个字符串的子字符串数目

 

提示

给你两个字符串 word1 和 word2 。

如果一个字符串 x 重新排列后,word2 是重排字符串的 前缀

字符串的前缀是从字符串的开头开始并延伸到其中任意点的子串。

 ,那么我们称字符串 x 是 合法的 。

请你返回 word1 中 合法 

子字符串 
 的数目。

示例 1:

输入:word1 = "bcca", word2 = "abc"

输出:1

解释:

唯一合法的子字符串是 "bcca" ,可以重新排列得到 "abcc" ,"abc" 是它的前缀。

示例 2:

输入:word1 = "abcabc", word2 = "abc"

输出:10

解释:

除了长度为 1 和 2 的所有子字符串都是合法的。

示例 3:

输入:word1 = "abcabc", word2 = "aaabc"

输出:0

 

解释:

  • 1 <= word1.length <= 105
  • 1 <= word2.length <= 104
  • word1 和 word2 都只包含小写英文字母。

 

复制代码
/**
 * @param {string} word1
 * @param {string} word2
 * @return {number}
 */
var validSubstringCount = function (word1, word2) {
    const diff = new Array(26).fill(0);
    const aNum = 'a'.charCodeAt(0);
    for (const c of word2) {
        diff[c.charCodeAt(0) - aNum]--;
    }
    let res = 0;
    let cnt = diff.filter(c => c < 0).length;
    const update = (c, add) => {
        diff[c] += add;
        if (add === 1 && diff[c] === 0) {
            cnt--;
        } else if (add === -1 && diff[c] === -1) {
            cnt++;
        }
    }
    let l = 0, r = 0;
    let n = word1.length;
    while (l < n) {
        while (r < n && cnt > 0) {
            update(word1.charCodeAt(r) - aNum, 1);
            r++;
        }
        if (cnt === 0) {
            res += n - r + 1;
        }
        update(word1.charCodeAt(l) - aNum, -1);
        l++;
    }
    return res;
};
复制代码

 

posted @   尖子  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示