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

力扣-2904最短且字典序最小的美丽子序列

给你一个二进制字符串 s 和一个正整数 k 。

如果 s 的某个子字符串中 1 的个数恰好等于 k ,则称这个子字符串是一个 美丽子字符串 。

令 len 等于 最短 美丽子字符串的长度。

返回长度等于 len 且字典序 最小 的美丽子字符串。如果 s 中不含美丽子字符串,则返回一个  字符串。

对于相同长度的两个字符串 a 和 b ,如果在 a 和 b 出现不同的第一个位置上,a 中该位置上的字符严格大于 b 中的对应字符,则认为字符串 a 字典序 大于 字符串 b 。

  • 例如,"abcd" 的字典序大于 "abcc" ,因为两个字符串出现不同的第一个位置对应第四个字符,而 d 大于 c 。

示例 1:

输入:s = "100011001", k = 3
输出:"11001"
解释:示例中共有 7 个美丽子字符串:
1. 子字符串 "100011001" 。
2. 子字符串 "100011001" 。
3. 子字符串 "100011001" 。
4. 子字符串 "100011001" 。
5. 子字符串 "100011001" 。
6. 子字符串 "100011001" 。
7. 子字符串 "100011001" 。
最短美丽子字符串的长度是 5 。
长度为 5 且字典序最小的美丽子字符串是子字符串 "11001" 。

示例 2:

输入:s = "1011", k = 2
输出:"11"
解释:示例中共有 3 个美丽子字符串:
1. 子字符串 "1011" 。
2. 子字符串 "1011" 。
3. 子字符串 "1011" 。
最短美丽子字符串的长度是 2 。
长度为 2 且字典序最小的美丽子字符串是子字符串 "11" 。 

示例 3:

输入:s = "000", k = 1
输出:""
解释:示例中不存在美丽子字符串。

提示:

  • 1 <= s.length <= 100
  • 1 <= k <= s.length

分析问题: 

        由题意知,s是由0,1组成的字符串,要在这个长字符串里面找子序列,使得该子序列里面1的个数等于k,那么首先我们要排除k大于s中所有1的个数,这时候直接return空字符串,否则我们去找所有的1,最美子序列的第一个数字一定是1,那么就可以进行s.count('1')-n+1个循环,去遍历所有的可能性,起始值是s中第一个1的下标,遍历过去就把这个1变成0,以便我们继续使用index函数。把所有可能性放进列表里面,筛选出长度最短的最美子序列以int类型放入另一个列表里面,方便我们进行比大小。然后输出最小的最短最美子序列,注意输出要求是字符串类型,还需将其转为str类型输出。

代码实现:

class Solution:def shortestBeautifulSubstring(self, s: str, k: int) -> str:v=''if s.count('1') <k: return vn=len(s)a_min=101 # 最小长度dp=[0]*(n+5)ls=[]for q in range(n):if s[q]=='1':dp[q]=1b=dp.count(1)for i in range(b-k+1):a=dp.index(1)+1kk=a-1v='1'l=1while l<k:if dp[a]==1:v+='1'l+=1else: v+='0'a+=1dp[kk]=0if len(v)<=a_min: a_min=len(v)ls.append(v)last=len(ls[-1])li=[]for w in ls:if len(w)==last: li.append(int(w))if len(li)==1: return str(li[0])return str(min(li))

总结:       

        首先对字符串 s 进行遍历,统计字符串 s 中 1 的数量并将结果存储在 dp 数组中。然后从 dp 数组中找出第一个出现 1 的位置,并依次向后构建长度为 k 的子串,判断子串的长度是否小于当前已找到的最小长度。如果是,则更新最小长度,并将当前子串长度和子串本身存储下来。最后对符合条件的子串进行筛选,返回最小的子串。

 

相关文章:

  • 【机器学习300问】95、什么是KNN算法?它和K-means什么关系?
  • 网络协议——有状态协议和无状态协议
  • linux下删除nginx进程
  • 自主创新助力科技强军,麒麟信安闪耀第九届军博会
  • 轻松拿捏C语言——【字符串函数】的使用及模拟实现
  • python02 循环与容器
  • DSVPN综合实验
  • 【JAVA基础之网络编程】UDP和TCP协议以及三次握手和四次挥手的过程
  • 【游戏引擎】Unity脚本基础 开启游戏开发之旅
  • Linux完整版命令大全(九)
  • Leecode热题100---55:跳跃游戏(贪心算法)
  • C++的模板(七):左值强制类型转换
  • ​Java基础复习笔记 第16章:网络编程
  • Ansible自动化运维中的Setup收集模块应用详解
  • 码蹄集部分题目(2024OJ赛16期;单调栈集训+差分集训)
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • Java 23种设计模式 之单例模式 7种实现方式
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Java比较器对数组,集合排序
  • js算法-归并排序(merge_sort)
  • Mocha测试初探
  • Netty 4.1 源代码学习:线程模型
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Shadow DOM 内部构造及如何构建独立组件
  • Vim Clutch | 面向脚踏板编程……
  • VUE es6技巧写法(持续更新中~~~)
  • 大主子表关联的性能优化方法
  • 缓存与缓冲
  • 聊聊directory traversal attack
  • 前端知识点整理(待续)
  • 浅谈web中前端模板引擎的使用
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 小试R空间处理新库sf
  • 一天一个设计模式之JS实现——适配器模式
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • ​LeetCode解法汇总518. 零钱兑换 II
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • #AngularJS#$sce.trustAsResourceUrl
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (二)pulsar安装在独立的docker中,python测试
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (七)Java对象在Hibernate持久化层的状态
  • (区间dp) (经典例题) 石子合并
  • (三)c52学习之旅-点亮LED灯
  • (算法设计与分析)第一章算法概述-习题
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (五)MySQL的备份及恢复
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转) RFS+AutoItLibrary测试web对话框