📅  最后修改于: 2023-12-03 14:54:28.225000             🧑  作者: Mango
给定一个字符串,由小写英文字母组成,打印该字符串的字典序最小的非回文排列。如果无法产生非回文排列,则输出“-1”。
为了得到字典序最小的非回文排列,我们需要将字符串中的字符按照字典序从小到大排序,然后从左到右交替打印头尾两端的字符,直到字符串结束。
但是如果字符串本身是一个回文串,那么无论我们如何交替打印,最终的排列都会是一个回文排列,无法满足条件。因此,我们需要通过判断字符串是否为回文串来决定是否需要交替打印。
def print_min_non_palindrome(s: str) -> str:
sorted_chars = sorted(s)
left = 0
right = len(s) - 1
result = ""
# 判断是否是回文串
is_palindrome = True
for i in range(len(s)//2):
if s[i] != s[len(s)-1-i]:
is_palindrome = False
break
# 如果不是回文串,交替打印头尾两端的字符
if not is_palindrome:
while left <= right:
if left != right:
result += sorted_chars[left]
result += sorted_chars[right]
else:
result += sorted_chars[left]
left += 1
right -= 1
else:
result = "-1"
return result
字符串 "abcba" 是一个回文串,无法得到字典序最小的非回文排列,输出 "-1"。
assert print_min_non_palindrome("abcba") == "-1"
字符串 "aaabbb" 的字典序最小的非回文排列为 "ababab"。
assert print_min_non_palindrome("aaabbb") == "ababab"
字符串 "abcdefg" 的字典序最小的非回文排列为 "abcdefg"。
assert print_min_non_palindrome("abcdefg") == "abcdefg"