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

embedded/2025/1/12 10:12:23/

【LetMeFly】3297.统计重新排列后包含另一个字符串的子字符串数目 I:滑动窗口

力扣题目链接:https://leetcode.cn/problems/count-substrings-that-can-be-rearranged-to-contain-a-string-i/

给你两个字符串 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 都只包含小写英文字母。

解题方法:滑动窗口

首先统计word2中每个字符分别出现了多少次,接着开始滑动窗口

窗口起点是word1的每个字符,窗口终点是第一次“合法”的最小结束位置。

对于一个起点l,若最小合法位置是r,则合法方案是[l, r][l, r + 1]...[l, len(word1) - 1]

  • 时间复杂度 O ( l e n ( w o r d 1 ) × C + l e n ( w o r d 2 ) ) O(len(word1)\times C+len(word2)) O(len(word1)×C+len(word2)),其中 C = 26 C=26 C=26
  • 空间复杂度 O ( C ) O(C) O(C)

AC代码

C++
/** @Author: LetMeFly* @Date: 2025-01-09 11:03:16* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-01-09 12:39:10*/
typedef long long ll;
class Solution {
private:bool ok(int* cnt1, int* cnt2) {for (int i = 0; i < 26; i++) {if (cnt1[i] < cnt2[i]) {return false;}}return true;}
public:ll validSubstringCount(string& word1, string& word2) {int cnt1[26] = {0}, cnt2[26] = {0};for (char c : word2) {cnt2[c - 'a']++;}ll ans = 0;for (int l = 0, r = 0; l < word1.size(); l++, r = max(r, l)) {if (l) {cnt1[word1[l - 1] - 'a']--;}while (!ok(cnt1, cnt2)) {if (r == word1.size()) {return ans;}cnt1[word1[r++] - 'a']++;}ans += word1.size() - r + 1;}return ans;}
};#ifdef _WIN32
/*
bcca
abc1
*/
/*
abcabc
abc10
*/
int main() {Solution sol;string a, b;while (cin >> a >> b) {cout << sol.validSubstringCount(a, b) << endl;}return 0;
}
#endif
Python
'''
Author: LetMeFly
Date: 2025-01-09 12:39:58
LastEditors: LetMeFly.xyz
LastEditTime: 2025-01-09 12:44:30
'''
from collections import Counter, defaultdictclass Solution:def ok(self, cnt1: defaultdict) -> bool:for k, v in self.cnt2.items():if cnt1[k] < v:return Falsereturn Truedef validSubstringCount(self, word1: str, word2: str) -> int:self.cnt2 = Counter(word2)cnt1 = defaultdict(int)ans = l = r = 0while l < len(word1):if l:cnt1[word1[l - 1]] -= 1while not self.ok(cnt1):if r == len(word1):return anscnt1[word1[r]] += 1r += 1ans += len(word1) - r + 1l += 1return ans
Java
/** @Author: LetMeFly* @Date: 2025-01-09 12:46:14* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-01-09 12:51:13*/
class Solution {private boolean ok(int[] a, int[] b) {for (int i = 0; i < 26; i++) {if (a[i] < b[i]) {return false;}}return true;}public long validSubstringCount(String word1, String word2) {int[] cnt1 = new int[26], cnt2 = new int[26];for (char c : word2.toCharArray()) {cnt2[c - 'a']++;}long ans = 0;for (int l = 0, r = 0; l < word1.length(); l++) {if (l > 0) {cnt1[word1.charAt(l - 1) - 'a']--;}while (!ok(cnt1, cnt2)) {if (r == word1.length()) {return ans;}cnt1[word1.charAt(r++) - 'a']++;}ans += word1.length() - r + 1;}return ans;}
}
Go
/** @Author: LetMeFly* @Date: 2025-01-09 12:52:14* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-01-09 13:10:20*/
package main// import "fmt"func ok(a, b []int) bool {for i := range a {if a[i] < b[i] {return false}}return true
}func validSubstringCount(word1 string, word2 string) (ans int64) {cnt1, cnt2 := make([]int, 26), make([]int, 26)for _, c := range word2 {cnt2[c - 'a']++}// fmt.Println(cnt2)for l, r := 0, 0; l < len(word1); l++ {if l > 0 {cnt1[word1[l - 1] - 'a']--}for !ok(cnt1, cnt2) {if r == len(word1) {return}cnt1[word1[r] - 'a']++r++}// fmt.Println(cnt1)// fmt.Println(r)ans += int64(len(word1) - r + 1)}return
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

Tisfy:https://letmefly.blog.csdn.net/article/details/145031494


http://www.ppmy.cn/embedded/152886.html

相关文章

python无需验证码免登录12306抢票 --selenium(2)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 [TOC](python无需验证码免登录12306抢票 --selenium(2)) 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 就在刚刚我抢的票&#xff1a;2025年1月8日…

JS DOM详解

DOM (文档对象模型) 文档对象模型 主要的职责是 处理网页中的标签(元素) 获取标签&#xff08;元素&#xff09;对象 document.getElementById(“id”) 根据标签的 ID 属性值 获取 指定的元素、 该方法 只能返回 一个标签。document.getElementsByTagName(“tag”) : 根据标签…

力扣-数组-108 将有序数组转换为二叉搜索树

解析 第一时间没思路&#xff0c;看了大佬的解析&#xff0c;首先数组有序&#xff0c;而平衡二叉搜索树又是左节点小于父节点小于右节点的&#xff0c;所以结合有序数组&#xff0c;不断二分就可以 代码 class Solution { public:TreeNode* sortedArrayToBST(vector<int…

Three.js 12中利用着色器进行材质加工深度解析

在Three.js这一强大的3D图形库中&#xff0c;着色器&#xff08;Shader&#xff09;是实现复杂视觉效果的关键工具。通过自定义着色器&#xff0c;开发者可以突破内置材质的限制&#xff0c;创造出独特且富有创意的材质效果。本文将深入探讨在Three.js 12中如何利用着色器对材质…

QT 将单线程改为线程池 端口扫描3.5

接上篇QT实现 端口扫描暂停和继续功能 3-CSDN博客 多线程与线程池的关系 多线程是基础: 线程池是基于多线程的概念实现的。线程池内部使用多个线程来并发执行任务。线程池优化多线程: 线程池通过复用线程和管理任务来优化多线程的使用&#xff0c;减少了线程创建和销毁的开销…

钓鱼攻击(Phishing)详解和实现 (网络安全)

钓鱼攻击&#xff08;Phishing&#xff09;详解和实现 钓鱼攻击是一种社会工程学攻击&#xff0c;攻击者通过伪装成可信任的实体诱使受害者泄露敏感信息&#xff0c;如用户名、密码、信用卡号等。以下详细介绍钓鱼攻击的原理、种类、实现方式&#xff0c;以及防御措施。 一、钓…

武汉火影数字|探秘数字展厅:开启沉浸式科技新体验

数字展厅&#xff0c;又叫做数字化展厅、多媒体数字化展厅等&#xff0c;是指以多媒体和数字化技术作为展示技术&#xff0c;使用最新的影视动画技术&#xff0c;结合独到的图形数字和多媒体技术&#xff0c;以各类新颖的技术吸引参观者&#xff0c;实现人机交互方式的展厅形式…

Python里JSON orjson ujson在json.loads有什么区别?

在Python中&#xff0c;json、orjson 和 ujson 都是用于处理JSON数据的库&#xff0c;但它们在性能、功能和使用方式上存在一些差异。下面将分别介绍这三个库在 loads 方法上的不同之处&#xff1a; ### 1. json (标准库) - **性能**&#xff1a;json 是Python的标准库之一&…