当前位置: 首页 > news >正文

Leetcode 3298. Count Substrings That Can Be Rearranged to Contain a String II

  • Leetcode 3298. Count Substrings That Can Be Rearranged to Contain a String II
    • 1. 解题思路
    • 2. 代码实现
  • 题目链接:3298. Count Substrings That Can Be Rearranged to Contain a String II

1. 解题思路

这一题和题目3297本质上就是一道题目,然后就是要优化一下算法,使之可以在 O ( N ) O(N) O(N)的时间复杂度内完成。

整体思路的话其实还是非常简单的,就是一个滑动窗口的思路,我们考察每一个位置作为左边界 i i i时,右边界的临界位置 j j j的坐标,此时能够给到的总的substring的个数就是 n − j + 1 n-j+1 nj+1个。

因此,对于题目3297,我们可以快速的给出一个非常直接地实现如下:

class Solution:def validSubstringCount(self, word1: str, word2: str) -> int:i, j, n = 0, 0, len(word1)cnt2 = Counter(word2)cnt = defaultdict(int)ans = 0while i < n:while j < n and any(cnt[ch] < cnt2[ch] for ch in string.ascii_lowercase):cnt[word1[j]] += 1j += 1if all(cnt[ch] >= cnt2[ch] for ch in string.ascii_lowercase):ans += n-j+1cnt[word1[i]] -= 1i += 1else:breakreturn ans

这个算法其实已经是一个 O ( N ) O(N) O(N)时间复杂度的算法了,不过对于题目3298,他还是没法通过全部的测试样例,因此,我们在这里就需要对这段代码进行一下优化,主要包括三个点的优化:

  1. 将counter的存储形式从dict修改为list,因为array的坐标查找比hash更快;
  2. 对于word2当中的字符,我们不需要遍历全部的26个字符,只需要查找word2当中出现过的字符即可,这样的话也可以有一定的效率优化;
  3. 当j固定之后,对于i的判断,我们不需要一直判断26个字母,只需要判断当前滑动删除的字符在删除前后是否还满足不少于word2即可。

然后,经过修改的代码就可以通过全部的测试样例了。

2. 代码实现

给出最终的python代码实现如下:

class Solution:def validSubstringCount(self, word1: str, word2: str) -> int:a = ord('a')i, j, n = 0, 0, len(word1)cnt2 = [0 for _  in range(26)]for ch in word2:cnt2[ord(ch) - a] += 1valids = [i for i in range(26) if cnt2[i] > 0]cnt = [0 for _ in range(26)]ans = 0while i < n:while j < n and any(cnt[i] < cnt2[i] for i in valids):cnt[ord(word1[j]) - a] += 1j += 1if j < n:ans += n-j+1cnt[ord(word1[i]) - a] -= 1i += 1else:breakif all(cnt[i] >= cnt2[i] for i in valids):while i < n and cnt[ord(word1[i]) - a] >= cnt2[ord(word1[i]) - a]:ans += n-j+1cnt[ord(word1[i]) - a] -= 1if cnt[ord(word1[i]) - a] < cnt2[ord(word1[i]) - a]:breaki += 1return ans

提交代码评测得到:耗时11046ms,占用内存26.3MB。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Pandas Series 概述与使用指南
  • [SDX35+WCN6856]SDX35 + WCN6856 默认增加打包wifi配置hostapd_24g.conf和hostapd_5g.conf操作方法
  • linux中vim编辑器的应用实例
  • Python画笔案例-058 绘制单击画酷炫彩盘
  • 第三篇 第16章 工程量清单计价
  • 大数据-144 Apache Kudu 基本概述 数据模型 使用场景
  • vitis2022.2生成动态设备树
  • Linux——应用层协议HTTP
  • 格力嵌入式面试题及参考答案
  • K8s 之微服务的定义及详细资源调用案例
  • Spring Boot管理用户数据
  • Golang面试题
  • 了解你的GPU:深入探讨AMD SMI
  • 基于yolov8+deepsort+gradio实现目标追踪演示
  • 用终端请求接口
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • crontab执行失败的多种原因
  • Elasticsearch 参考指南(升级前重新索引)
  • git 常用命令
  • Hibernate【inverse和cascade属性】知识要点
  • jdbc就是这么简单
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 汉诺塔算法
  • 机器学习中为什么要做归一化normalization
  • 入门级的git使用指北
  • 小李飞刀:SQL题目刷起来!
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • ‌内网穿透技术‌总结
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #QT(智能家居界面-界面切换)
  • #控制台大学课堂点名问题_课堂随机点名
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • $.ajax()
  • (13)DroneCAN 适配器节点(一)
  • (C11) 泛型表达式
  • (第二周)效能测试
  • (二)正点原子I.MX6ULL u-boot移植
  • (论文阅读30/100)Convolutional Pose Machines
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (算法)Game
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转)四层和七层负载均衡的区别
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .NET 5种线程安全集合
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • @ModelAttribute使用详解
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决