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

Leetcode 3458. Select K Disjoint Special Substrings

  • Leetcode 3458. Select K Disjoint Special Substrings
    • 1. 解题思路
    • 2. 代码实现
  • 题目链接:3458. Select K Disjoint Special Substrings

1. 解题思路

这一题我的思路的话就是找出给定的字符串当中做多能得到的特殊子串的数目,然后判断其是否大于给定值 k k k即可。

然后关于如何求字符串能够获得的特殊子串的最大数目,我的思路是使用动态规划的思路。

首先考察每一个字符出现的所有位置,然后将其起始位置进行排序,显然,对每一个特殊子串,其必须要包括全部的其初始字符的全部位置,因此,我们可以根据每一个字符的初始位置和结束位置找出要涵盖所处范围内所有字符的初试和结束位置的最短长度。然后,我们额外判断一下其他字符是否确实都没有出现在对应的范围内,即可判断该选择是否合法。

由此,我们只需要依次考察每一个元素的起始位置要作为特殊子串的起点位置即可找出最多的切分方式。

2. 代码实现

给出python代码实现如下:

class Solution:
    def maxSubstringLength(self, s: str, k: int) -> bool:
        locs = defaultdict(list)
        for i, ch in enumerate(s):
            locs[ch].append(i)
            
        starts = sorted([(indexes[0], ch) for ch, indexes in locs.items()])
        n = len(starts)

        @lru_cache(None)
        def dp(idx):
            if idx >= n:
                return 0
            
            st, ch = starts[idx]
            seen = {ch}
            ed, nxt = locs[ch][-1], idx
            for _st, ch in starts[idx:]:
                if _st > ed:
                    break
                ed = max(ed, locs[ch][-1])
                seen.add(ch)
                nxt += 1
                
            is_allowed = not (st == 0 and ed == len(s)-1)
            for ch, indexes in locs.items():
                if ch in seen:
                    continue
                i = bisect.bisect_left(indexes, st)
                if i < len(indexes) and indexes[i] < ed:
                    is_allowed = False
                    break

            if is_allowed:
                return max(dp(idx+1), 1 + dp(nxt))
            else:
                return dp(idx+1)
        
        return dp(0) >= k     

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

相关文章:

  • 算法学习036 C++最长上升子序列LIS 动态规划DP算法实现最长上升子序列 中小学算法思维学习 比赛算法题解 信奥算法解析
  • Wireshark 输出 数据包列表本身的值
  • SpringBoot中集成SaToken
  • vue3开发打年兽功能
  • 【论文笔记】On Generative Agents in Recommendation
  • DeepSeek 本地部署方法介绍
  • 鸡兔同笼问题
  • 20.【线性代数】——坐标系中,平行四边形面积=矩阵的行列式
  • ES快照备份索引数据(已亲测)
  • 数据恢复-01-机械硬盘的物理与逻辑结构
  • 【C语言】第二期——运算符与表达式
  • PMBOK第7版整体架构全面详解
  • AI芯片:科技变革的核心驱动力
  • QT (四)模型/视图 QFileSystemModel,QStringListModel,QStandardItemModel
  • 【生产变更】- 集群中配置SCAN ip的不同端口应用
  • 2步破解官方sublime4最新版本 4192
  • 基于SpringBoot的小区运动中心预约管理系统
  • Redis可视化连接工具RedisDesktopManager的下载与安装
  • 前端:最简单封装nmp插件(组件)过程。(待完善)
  • Spring Bean 生命周期的执行流程
  • 哈马斯官员:若实现永久停火,可交出加沙地带控制权
  • 习近平同巴西总统卢拉共同会见记者
  • 成都警方通报:8岁男孩落水父母下水施救,父亲遇难
  • 中国创面修复学科发起者之一陆树良教授病逝,享年64岁
  • 缺字危机:一本书背后有多少“不存在”的汉字?
  • 福建宁德市长张永宁拟任设区市党委正职,曾获评全国优秀县委书记