构造回文字符串问题
小C手中有一个由小写字母组成的字符串 s。她希望构造另一个字符串 t,并且这个字符串需要满足以下几个条件:
t由小写字母组成,且长度与s相同。t是回文字符串,即从左到右与从右到左读取相同。t的字典序要小于s,并且在所有符合条件的字符串中字典序尽可能大。
小C想知道是否能构造出这样的字符串 t,输出这样的t。如果无法构造满足条件的字符串,则输出 -1。
测试样例
样例1:
输入:
s = "abc"输出:'aba'
样例2:
输入:
s = "cba"输出:'cac'
样例3:
输入:
s = "aaa"输出:'-1'
解题思路
这道题要求构造一个回文字符串,并且满足字典序小于 s 且尽可能大。以下是解决思路:
-
构造回文字符串:
- 回文字符串要求从左到右和从右到左读取一致,因此可以通过将
s的左半部分映射到右半部分来构造一个初步的回文字符串t。
- 回文字符串要求从左到右和从右到左读取一致,因此可以通过将
-
字典序的判断:
- 将初步构造的回文字符串
t与s比较。 - 如果
t < s,则t满足条件,可以直接返回。 - 如果
t >= s,说明t不符合条件,需要进一步调整t使其小于s。
- 将初步构造的回文字符串
-
调整字符串使字典序最大化:
- 若
t >= s,可以调整t的中间字符(若长度为奇数)或中间两个字符(若长度为偶数),让t尽量小于s。
- 若
字符串的字典序比较
在 Python 中,字符串的字典序比较可以直接使用 <, <=, >, >= 运算符进行。这些运算符会从字符串的第一个字符开始逐一比较,直到找到第一个不同的字符为止。如果所有字符相同但长度不同,则较短的字符串字典序更小。
print("abc" < "abd") # True,因为 "c" < "d"print("abc" < "abcd") # True,因为 "abc" 比 "abcd" 短
特殊情况
s全部由字母a组成:如"aaa",此时无法构造符合条件的字符串t,直接返回-1。- 长度为 1 的字符串:例如
s = "a",因为没有比单个字符a更小的回文字符串,因此返回-1。
def solution(s2: str) -> str:
s=s2
s=list(s)
n=len(s)
i,j=0,n-1
b=0
half=int(n/2)
while(i<half):
s[j]=s[i]
i+=1
j-=1
s="".join(s)
if(s<s2):return s
elif(s==s2 and s[0]=="a"):return "-1"
else :
if(n%2==1):
s=list(s)
if(s[half]=="a"):
s[half]="z"
s[half-1]= chr(ord(s[half-1])-1)
s[half+1]= s[half-1]
else:s[half]= chr(ord(s[half])-1)
s="".join(s)
return s
else:
s=list(s)
if(s2[half]<s2[half-1]):
print(s2[half-1])
s[half-1]= chr(ord(s2[half-1])-1)
elif (s2[half]==s2[half-1]):
s[half-1]= chr(ord(s2[half-1])-1)
print(s[half-1])
s[half]=s[half-1]
s="".join(s)
return s
if __name__ == '__main__':
# 测试用例
print(solution("abc")) # 输出: 'aba'
print(solution("cba")) # 输出: 'cac'
print(solution("aaa")) # 输出: '-1'
print(solution("aaabbbbcaaaccaba")) # 输出: '-1'