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

解决leetcode第3734题大于目标字符串的最小字典序回文排列

3734.大于目标字符串的最小字典序回文排列

难度:困难

问题描述:

给你两个长度均为n的字符串s和目标字符串target,它们都由小写英文字母组成。

返回字典序最小的字符串,该字符串既是s的一个回文排列,又是字典序严格大于target的。如果不存在这样的排列,则返回一个空字符串。

如果字符串a和字符串b长度相同,在它们首次出现不同的位置上,字符串a处的字母在字母表中的顺序晚于字符串b处的对应字母,则字符串a在字典序上严格大于字符串b。

排列是指对字符串中所有字符的重新排列。

如果一个字符串从前向后读和从后向前读都一样,则该字符串是回文的。

示例1:

输入:s="baba",target="abba"

输出:"baab"

解释:

s的回文排列(按字典序)是"abba"和"baab"。

字典序最小的、且严格大于target的排列是"baab"。

示例2:

输入:s="baba",target="bbaa"

输出:""

解释:

s的回文排列(按字典序)是"abba"和"baab"。

它们中没有一个在字典序上严格大于target。因此,答案是""。

示例3:

输入:s="abc",target="abb"

输出:""

解释:

s没有回文排列。因此,答案是""。

示例4:

输入:s="aac",target="abb"

Output:"aca"

解释:

s唯一的回文排列是"aca"。

"aca"在字典序上严格大于target。因此,答案是"aca"。

提示:

1<=n==s.length==target.length<=300

s和target仅由小写英文字母组成。

问题分析:

首先要判断字符串s是否能够构成一个回文字符串,有3种情况,一是构成字符串长度为偶数的回文字符串,二是构成字符串长度为奇数的回文字符串,三是不能构成回文字符串。将这3种类型各给一个类型编码分别为1、2、3,函数check_palindrome_str_code(s)完成此功能,返回类型编码和各个字符在s中出现的次数列表。

其次根据分析字符串s得到的类型编码和各字符在s中出现次数,构造出相应的回文字符串,并返回经过按字典序排序的回文字符串列表,函数constructing_a_palindrome(code,a)实现这一功能,当然完成这一功能还需要add_char_into_str(c,s)和get_all_array(s)函数的配合。

最后,在主程序中,根据得到的回文字串列表,将列表中的回文字符串依次和target进行比较,输出字典序严格大于target的字典序最小的回文字字符串。

程序如下:

#判断一个字符串中的字符是否能够成为一个回文字符串,如果是偶数个字符成为回文串,返回1,如果是奇数个字符成为回文串,返回2,否则返回3
def check_palindrome_str_code(s):s=list(s)t=set(s)a=[]j_count=0code=0for i in t:n=s.count(i)a.append([i, n])if n%2==1:j_count=j_count+1if j_count>1:code=3if j_count==0:return 1,aelif j_count==1:return 2,aelse:return 3,a#将一个字符加入一个字符串的各个位置形成全排列
def add_char_into_str(c,s):a=[]n=len(s)for i in range(n+1):left=s[0:i]right=s[i:]a.append(left+c+right)return a#根据字符串构造全排列
def get_all_array(s):n=len(s)a=[]if n==1:return [s]else:c=s[-1]t=get_all_array(s[:n-1])for i in t:a.extend(add_char_into_str(c,i))return a#根据不同的回文串情形,构造回文串
def constructing_a_palindrome(code,a):if code==1:s=''for i in a:s=s+i[0]*(i[1]//2)t=get_all_array(s)t=list(k+k[::-1] for k in t)t.sort()return telif code==2:s=''j=''for i in a:if i[1]%2==1:j=i[0]s=s+i[0]*(i[1]//2) if i[1]%2==0 else s+i[0]*((i[1]-1)//2)t=get_all_array(s)t=list(k+j+k[::-1] for k in t)t.sort()return telse:return []s=input('pls input s=')
target=input('pls input target=')
code,a=check_palindrome_str_code(s)
t=constructing_a_palindrome(code,a)
for i in t:if i>target:print(i)break
else:print('""')

运行实例一

pls input s=ababab

pls input target=babaab

""

运行实例二

pls input s=abab

pls input target=abab

Abba

运行实例三

pls input s=abcbca

pls input target=acbbca

Baccab

运行实例四

pls input s=abbbcca

pls input target=acacbbb

acbbbca

http://www.dtcms.com/a/569012.html

相关文章:

  • mysql数据做彩票网站网站建设合作合同模板下载
  • 抖音很火的多弹窗系统源码 多用户版 附教程
  • EtherNet/IP转 EtherCAT 物联网网关实现汇川PLC与施耐德伺服数据交互
  • 个人网站空间网站建设步骤详解视频
  • 【前端】js写十种排序算法(未完待续…)
  • c实践复建运动
  • io_uring:Linux 上的高性能异步 I/O
  • TPP热蛋白组分析:样本全覆盖-温度梯度设置指南,精准捕获作用靶点
  • Oracle dgbroker常规命令管理简介
  • PsLoggedOn(7.17):谁在登录?多会话取证与审计
  • 深圳网站美化美容培训东莞网站建设
  • 网站开发流程主要分成什么wordpress 文艺小清新
  • 【Java8新特性】Stream 流深度实战:创建 /filter/map/collect 常用操作 + 惰性求值原理解析 + 并行安全避坑
  • 【STM32】智能排队控制系统
  • AISaaS出海工具整理
  • 电商网站如何做精细化运营dw软件下载官方免费下载
  • 在线教程丨端侧TTS新SOTA!NeuTTS-Air基于0.5B模型实现3秒音频克隆
  • 测试开发话题10---自动化测试常用函数(2)
  • Auto CAD二次开发——镜像图形对象
  • 软考 关于23种设计模式
  • golang 网站开发 教程网站建设公司如何规避风险
  • 建设电子商务网站论文网站开发核心技术
  • nestjs集成grpc服务
  • Milvus:标量索引详解(十三)
  • 【仓颉纪元】仓颉学习深度实践:30 天从零基础到独立开发
  • RocketMQ【入门实践】
  • Harmony鸿蒙开发0基础入门到精通Day11--TypeScript篇
  • 网站做广告的好处软件定制开发平台
  • 从智能手表拆解看硬件与软件的魔法融合 -嵌入式开发
  • 【java基础语法】---- 综合训练