解决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
