Leetcode3298:统计重新排列后包含另一个字符串的子字符串数目 II

server/2025/1/13 8:12:52/

题目描述:

给你两个字符串 word1 和 word2 。如果一个字符串 x 重新排列后,word2 是重排字符串的前缀,那么我们称字符串 x 是 合法的 。

请你返回 word1 中 合法子字符串的数目。

注意 ,这个问题中的内存限制比其他题目要  ,所以你 必须 实现一个线性复杂度的解法

代码思路:

  1. 初始化字符计数器
    • 使用defaultdict(int)来初始化一个计数器cnt,用于存储word2中每个字符的出现次数。这里选择defaultdict是为了在访问不存在的键时自动返回默认值(这里是0),从而避免KeyError。
  2. 统计word2中不同字符的数量
    • 遍历word2,对每个字符在cnt中计数。同时,用变量cword记录word2中不同字符的数量。
  3. 初始化滑动窗口的左右指针和结果变量
    • l(左指针)和r(右指针)分别初始化为0,用于定义当前考虑的子字符串范围。
    • ans用于累加所有符合条件的子字符串的起始索引数量。
  4. 遍历word1,使用滑动窗口寻找符合条件的子字符串
    • 对于word1中的每个字符(通过右指针r遍历),将其在cnt中的计数减1。
    • 如果某个字符的计数变为0,说明这个字符在当前的子字符串中已经匹配了word2中需要的数量,因此将cword(不同字符的数量)减1。
    • cword变为0时,意味着当前窗口内的字符可以组成word2(通过删除一些字符),此时尝试扩展窗口的左边界,直到找到一个不满足条件的字符(即某个字符在word2中的需求未被满足),或者窗口为空。
      • 在尝试扩展左边界的过程中,每次将左指针l指向的字符在cnt中的计数加1,如果计数变为正数,说明这个字符在word2中有需求,因此cword加1。
    • 每次当cword为0时(即找到了一个符合条件的子字符串),将左指针l的值累加到ans中。这里累加l的原因是,以l为起点的任何子字符串(包括空字符串)都可以通过删除一些字符变成word2。例如,如果l是3,那么索引3, 4, 5,...到当前右指针r的子字符串都符合条件(因为从lr已经是一个完全匹配或超出的集合)。
  5. 返回结果
    • 返回累加的结果ans,即word1中所有符合条件的子字符串(包括空字符串)的起始索引数量总和。

 代码实现:

python">from collections import defaultdict
class Solution:def validSubstringCount(self, word1: str, word2: str) -> int:# cnt = Counter(word2) 用Counter会慢许多,也能过cnt = defaultdict(int)for word in word2:cnt[word] += 1cword = len(cnt)l, ans = 0, 0for r in word1:cnt[r] -= 1if cnt[r] == 0:cword -= 1while cword == 0:cnt[word1[l]] += 1if cnt[word1[l]] > 0:cword += 1l += 1ans += lreturn ans


http://www.ppmy.cn/server/157964.html

相关文章

leetcode 面试经典 150 题:两数之和

链接两数之和题序号1题型数组解题方法1. 哈希表,2. 暴力法难度简单熟练度✅✅✅✅✅ 题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输…

Windows 下Mamba2 / Vim / Vmamba 环境安装问题记录及解决方法终极版(无需绕过triton)

导航 安装教程导航 Mamba 及 Vim 安装问题参看本人博客:Mamba 环境安装踩坑问题汇总及解决方法(初版)Linux 下Mamba 及 Vim 安装问题参看本人博客:Mamba 环境安装踩坑问题汇总及解决方法(重置版)Windows …

QT Must be called on Chrome_UIThread; actually called on Unknown Thread.

具体错误 [4448:9040:0109/135034.634:FATAL:render_frame_host_impl.cc(672)] Check failed: ::content::BrowserThread::CurrentlyOn(BrowserThread::UI). Must be called on Chrome_UIThread; actually called on Unknown Thread. Backtrace:QWebEngineUrlSchemeHandler::q…

A2. 大语言模型llama API服务调研

自然语言模型大家听的比较多的是OpenAI,它有聊天(Chat)、补全(Completion)、提取结果信息(Extract Result Information)、模拟聊天(Mock Chat)等功能;还有其它语言模型比如Google公司研发的mBERT (Multilingual BERT)、BERT (Bidirectional Encoder Representations …

使用 SQL 和表格数据进行问答和 RAG(6)—将指定目录下的 CSV 或 Excel 文件导入 SQLite 数据库

将指定目录下的 CSV 或 Excel 文件导入 SQLite 数据库。以下是详细代码逻辑: 1. 类结构 该类包含三个主要方法: _prepare_db:负责将文件夹中的 CSV 和 XLSX 文件转换为 SQL 表。_validate_db:用于验证 SQL 数据库中创建的表是否…

kotlin项目无法访问Java类的问题

使用IntelliJ创建一个Kotlin项目,然后在src/main/kotlin中创建一个java接口:Animal.java,然后在Main.kt中打印这个java接口,如下: fun main() {println(Animal::class.java) }代码在编辑器中并没有报错,但…

消息队列架构、选型、专有名词解释

私人博客传送门 消息队列专有名词解释 | 魔筝炼药师 MQ选型 | 魔筝炼药师 MQ架构 | 魔筝炼药师 MQ顺序消息 | 魔筝炼药师

实现Android应用开机自启功能

在开发某些类型的Android应用程序时,可能需要在设备启动后自动运行该应用。例如,对于企业级应用、监控软件或特定的工具类应用来说,这一特性尤为重要。本文将详细介绍如何通过修改AndroidManifest.xml文件并编写相应的广播接收器来实现这一目…