LeetCode:3297. 统计重新排列后包含另一个字符串的子字符串数目 I(滑动窗口 Java)

目录

[3297. 统计重新排列后包含另一个字符串的子字符串数目 I](#3297. 统计重新排列后包含另一个字符串的子字符串数目 I)

题目描述:

实现代码与解析:

滑动窗口

原理思路:


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

题目描述:

给你两个字符串 word1word2

如果一个字符串 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
  • word1word2 都只包含小写英文字母。

实现代码与解析:

滑动窗口

java 复制代码
class Solution {
    public long validSubstringCount(String word1, String word2) {

        if (word1.length() < word2.length()) {
            return 0;
        }

        int[] hash = new int[26];
        // 种类
        int cnt = 0;
        for (char c : word2.toCharArray()) {
            if (hash[c - 'a']++ == 0) cnt++;
        }

        int[] cur = new int[26];

        long res = 0;
        for (int l = 0, r = 0; r < word1.length(); r++) {

            if (++cur[word1.charAt(r) - 'a'] == hash[word1.charAt(r) - 'a']) {
                cnt--;
            }
            while (cnt == 0) {
                if (cur[word1.charAt(l) - 'a'] == hash[word1.charAt(l) - 'a']) {
                    cnt++;
                }
                cur[word1.charAt(l) - 'a']--;
                l++;
            }
            res += l;

        }
        return res;
    }
}

原理思路:

题目含义:求在 word1 中,有多少个子串包含 word2 中的所有字符。

hash记录字母出现次数,cnt记录当前还需要的满足条件的字母的数量。

如果我们在word1中找到了一个最短的 子串s(假设s=word[l,r])包含了所有的word2的字符,那么: word1[0:r],word1[1:r],word1[2:r],...,word[l,r]都符合条件,这些子串的个数是l+1。

相关推荐
Allen Bright18 分钟前
【JVM-1】深入解析JVM:Java虚拟机的核心原理与工作机制
java·开发语言·jvm
中國移动丶移不动37 分钟前
深入解读五种常见 Java 设计模式及其在 Spring 框架中的应用
java·后端·spring·设计模式·mybatis
兜里ヌ有糖37 分钟前
Spring——自动装配
java·后端·spring
m0_6724496038 分钟前
springmvc前端传参,后端接收
java·前端·spring
等一场春雨1 小时前
Java 分布式锁:Redisson、Zookeeper、Spring 提供的 Redis 分布式锁封装详解
java·分布式·java-zookeeper
上海拔俗网络1 小时前
“AI智能实训系统:让学习更高效、更轻松!
java·团队开发
胡耀超1 小时前
解读若依框架中的`@Excel` 和 `@Excels` 注解
java·excel·若依
拾忆,想起2 小时前
Spring拦截链揭秘:如何在复杂应用中保持控制力
java·数据库·spring
小冯的编程学习之路2 小时前
【LeetCode】:稀疏相似度【困难】
c++·算法·leetcode
HelloZheQ2 小时前
Spring 中的 @RestController 注解详解
java·后端·spring