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

Leetcode 2953. Count Complete Substrings

  • Leetcode 2953. Count Complete Substrings
    • 1. 解题思路
    • 2. 代码实现
  • 题目链接:2953. Count Complete Substrings

1. 解题思路

这一题麻烦的点就在于说有两个限制条件,但是好的点在于说这两个限制条件事实上是相互独立的。

因此,我们可以通过第二个限制条件将字符串进行分段,此时目标子串必然在各个分段字符串之内,且此时我们只需要考虑第一个限制条件即可。

而对于第一个限制条件,一个简单的思路就是对26个字符建一个counter,然后分别对每一个位置作为起始点的情况进行考察。

显然,如果要成立,那么目标字符串长度一定是 k k k的倍数,且如果任何一个字符的个数超过 k k k时就一定不成立。

但是,直接这样的实现我们发现会出现超时,因此我们加了一些奇技淫巧用于优化算法,主要就是对于只有一个字符的情况进行了一下优化,因为如果只有一个字符的话,那么可能的个数就一定是 n − k + 1 n-k+1 nk+1个。

2. 代码实现

给出python代码实现如下:

class Solution:
    def countCompleteSubstrings(self, word: str, k: int) -> int:
        
        def count_complete(s):
            n = len(s)
            if n < k:
                return 0
            if len(set(s)) == 1:
                return n-k+1
            
            cnt = [[0 for _ in range(26)] for _ in range(n+1)]
            for i, ch in enumerate(s):
                for j in range(26):
                    cnt[i+1][j] = cnt[i][j]
                cnt[i+1][ord(ch) - ord('a')] += 1
            
            ans = 0
            for i in range(n-k+1):
                j = i+k
                while j <= n:
                    diff = [y-x for x, y in zip(cnt[i], cnt[j])]
                    if any(x > k for x in diff):
                        break
                    if all(x == k or x == 0 for x in diff):
                        ans += 1
                    j += k
            return ans
        
        idx = 0
        i, n = 0, len(word)
        ans = 0
        while i < n-1:
            if abs(ord(word[i]) - ord(word[i+1])) > 2:
                ans += count_complete(word[idx:i+1])
                idx = i+1
            i += 1
        ans += count_complete(word[idx:])
        return ans

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


http://www.kler.cn/a/157204.html

相关文章:

  • 力扣每日一题 3258. 统计满足 K 约束的子字符串数量 I
  • [免费]SpringBoot+Vue3校园宿舍管理系统(优质版)【论文+源码+SQL脚本】
  • FMC 扩展子卡6 路 422,8 组 LVDS,8 路 GPIO
  • day60 图论章节刷题Part10(Floyd 算法、A * 算法)
  • 【网络】应用层——HTTP协议
  • 【Go】-gRPC入门
  • 电梯安全远程监控系统的主要作用和意义
  • 华清远见嵌入式学习——C++——作业3
  • PTA 7-223 sdut-C语言实验-求阶乘(循环结构)
  • 基于Java SSM教学管理系统
  • C语言 操作符详解
  • vue项目配置多个代理
  • SpringBoot集成Mybatis使用切面对所有Service的事务统一管理
  • xattr -r -d com.apple.quarantine是用于删除文件的扩展属性的命令
  • 五、分支和循环
  • JNPF低代码平台高效赋能开发者
  • Glide系列-活动缓存和内存缓存
  • 人工智能_机器学习060_核函数对应数学公式_数据空间错位分割_简单介绍_以及核函数总结---人工智能工作笔记0100
  • 兔子的后院奇遇:深入了解RabbitMQ中的死信队列【RabbitMQ 四】
  • 基于python电商销售数据可视化大屏全屏系统设计与实现+开题报告
  • pytorch bert实现文本分类
  • 前端开发_CSS
  • 大数据之HBase(二)
  • 《开箱元宇宙》:Madballs 解锁炫酷新境界,人物化身系列大卖
  • Linux基础操作一:连接Linux
  • 从顺序表中删除具有最小值的元素(假设唯一) 并由函数返回被删元素的值。空出的位 置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。