📌  相关文章
📜  打印字符的字典序最小非回文排列的最后一个字符串(1)

📅  最后修改于: 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"