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

解决leetcode第3816题.删除重复字符后的字典序最小字符串

3816.删除重复字符后的字典序最小字符串

难度:困难

问题描述:

给你一个字符串s,它由小写英文字母组成。

你可以进行如下操作任意次(可能为零次):

选择当前字符串s中至少出现两次的任意一个字母并删除其中的一次出现。

返回可以通过这种方式形成的字典序最小的结果字符串。

如果字符串a的某个位置与字符串b不同,且a在该位置的字母比b对应位置的字母在字母表中更靠前,则a被认为是字典序更小的字符串。如果a的前min(a.length,b.length)个字符都与b相同,则较短的字符串字典序更小。

示例1:

输入:s="aaccb"

输出:"aacb"

解释:

可以形成字符串"acb"、"aacb"、"accb"和"aaccb"。其中"aacb"是字典序最小的。

例如,可以选择字母'c'并删除它的第一次出现,得到"aacb"。

示例2:

输入:s="z"

输出:"z"

解释:

无法进行任何操作。只能形成字符串"z"。

提示:

1<=s.length<=105

s仅包含小写英文字母。

问题分析:

处理该问题经历了以下步骤

1先将字符串s中字符重复次数不小于2的字符找出,并将各个字母在字符串中出现的位置以列表形式给出,这些位置都是可能删除的位置。比如对于字符串aabbc,字符a和b重复次数不小于2次,字符a出现的位置为[0,1],字符b出现的位置为[2,3]。把不删除的情况也考虑进去,用-1表示不删除,则上面的列表依次变为[-1,0,1]和[-1,2,3]

2 把不同字母出现的索引号位置转换成跟字符串s等长的二进制字符串,如果不删除则字符串中不出现1,比如a出现的位置为[‘00000’,‘10000’,’01000’],b出现的位置为[‘00000’,‘00100’,’00010’]。如果原字符串s中没有重复的字符,则生成与原字符串等长的全是0的二进制字符串

3 重复的字符只删除一次出现,所以要把删除的位置进行排列组合,就会出现下面的情况:[‘00000’,’00100’,’00010’,’10000’,’10100’,’10010’,’01000’,’01100’,’01010’],这种排列组合可以通过二进制或操作可以实现

4 上面的二进制排列实际上相当于是对原字符串进行处理的蒙板,对原字符串按蒙板进行操作,删除蒙板中1位置对应字符,保留0位置对应的字符,即是进行删除操作之后形成的字符串,如果其中有重复,去掉重复项,再进行字典升序排序,那么其中的第一个字符串即是字典序最小的

程序如下:

#在字符串a中找到所有字符出现的次数,将次数不少于2次的字符保留,并形成元素为[字符,次数]的列表返回 def get_more_than_two_times_char_list(a): a=list(a) b=set(a) t=[] for i in b: t.append([i,a.count(i)]) d=list(i for i in t if i[1]>=2) d.sort(key=lambda x: x[0]) return d #根据字符个数不小于2次的列表,生成每个字符出现的索引号列表并返回 def get_more_than_two_times_char_index_list(a,s): b=[] for i in a: c=[-1] #-1表示不去掉该字符的任何一个索引号 k=0 for j in range(i[1]): n=s.index(i[0],k) c.append(n) k=n+1 b.append(c) return b #根据索引号列表中的数据,将对应索引号位置以二进制的形式置为1 def create_binary_list(nums,n): b='0'*n c=[] for i in nums: if i==-1: c.append(b) else: left = b[:i] right = b[i + 1:] c.append(left + '1' + right) return c #将两种字符出现的索引号二进制数进行或运算,获得组合之后的排列并返回 def get_combination_index(a,b,n): t=[] for i in a: for j in b: xi=int(i,2) xj=int(j,2) k=xi|xj x=bin(k)[2:] len_x=len(x) x=(n-len_x)*'0'+x t.append(x) return t #生成字符个数不少于2的所有字符索引排列并返回 def get_all_combination_index(s): n=len(s) a=get_more_than_two_times_char_list(s) if not a: return [n*'0'] b=get_more_than_two_times_char_index_list(a,s) c=create_binary_list(b[0],n) m=len(b) for i in range(1,m): d=create_binary_list(b[i],n) c=get_combination_index(c,d,n) return c #将二进制形式的字符串解析为原字符串 def get_mask_str(s,mask): n=len(s) s=list(s) mask=list(mask) s_mask=zip(s,mask) s_mask=list(k[0] for k in s_mask if k[1]=='0') return ''.join(s_mask) #主程序 s=input('pls input s=') c = get_all_combination_index(s) t = [] for i in c: b = get_mask_str(s, i) t.append(b) t = list(set(t)) t.sort() if len(t)==1: print(f'无法进行任何操作。只能形成字符串{t[0]}') else: print(f'可以形成的字符串有{t},其中{t[0]}是字典序最小的')

运行实例一

pls input s=ab

无法进行任何操作。只能形成字符串ab

运行实例二

pls input s=aabacb

可以形成的字符串有['aaacb', 'aabac', 'aabacb', 'aabc', 'aabcb', 'aacb', 'abac', 'abacb'],其中aaacb是字典序最小的

运行实例三

pls input s=aaab

可以形成的字符串有['aaab', 'aab'],其中aaab是字典序最小的

http://www.jsqmd.com/news/273360/

相关文章:

  • 一文掌握k8s的污点和容忍度
  • 2026年钢板止水带市场热议:哪些直销厂家表现突出?,止水钢板/穿墙螺杆/u型丝预埋件,钢板止水带直销厂家口碑推荐榜 - 品牌推荐师
  • 2026年钢板止水带市场热议:哪些直销厂家表现突出?,止水钢板/穿墙螺杆/u型丝预埋件,钢板止水带直销厂家口碑推荐榜 - 品牌推荐师
  • 一文掌握k8s的健康检查探针
  • 重构内容战略:从SEO关键词到GEO语境单元的思维跃迁
  • 2026年国内优秀的气动单轨吊直销厂家排行,HQ气动葫芦/30吨气动葫芦/牧田气动葫芦,气动单轨吊制造企业怎么选择 - 品牌推荐师
  • 2026年天津离婚房产分割律师联系电话推荐:高效咨询与权益保障 - 品牌推荐
  • 一文掌握k8s的升级更新策略
  • 数据驱动与敏捷优化:GEO时代的营销效能度量与增长黑客
  • 2026年天津婚姻律师联系电话推荐:精选推荐与使用指南 - 品牌推荐
  • 生态博弈与未来前瞻:GEO将如何重塑互联网、商业与竞争格局
  • 如何在网页中实现跨平台的大文件切片上传?
  • 信创环境下如何选择合适的大文件上传插件?
  • 信任链重构:当AI成为品牌与消费者之间的“信任中介”
  • WordPress开发者如何自定义Word导入的格式映射规则?
  • 政务站群如何配置WordPress实现PDF目录结构化提取?
  • 农业信息化平台如何通过WordPress处理Excel批量导入?
  • 2026年盘点比较好的税务风险管控专业公司,天津捷瑞通排第几? - 工业品牌热点
  • 智能制造MES系统如何调用WordPress的PPT转码接口?
  • 【大白专访09下】80万美金自营账户准备稳定出金时,平台却倒闭了
  • aepic.dll文件丢失找不到问题 免费下载方法分享
  • 2025年索具品牌口碑排行,链条索具优选来啦,钢卷吊具/吊装带/组装型索具/成套索具/吊具/环形吊带,索具生产商联系方式 - 品牌推荐师
  • 安可测评1月更新!鸿蒙系统入选!国产CPU、操作系统、数据库合集
  • AI智能办公鼠标服务哪家靠谱,南方网通鸿容鼠标是优选 - 工业品牌热点
  • R语言森林生态系统结构、功能与稳定性全流程分析——群落多样性、机器学习、SEM与时间序列建模
  • 用Keras轻量化部署医疗模型稳推理
  • 前后端分离架构,全功能社区论坛小程序商业运营源码系统
  • 示波器中电压有效值(Vrms)和峰峰值(Vpp)的关系
  • 为何需要“电压有效值”
  • 2026国内最新天然留香香精生产厂家top5推荐!广东广州优质品牌及厂商全面解析,助力日化香氛行业高效选品 - 品牌推荐2026