📅  最后修改于: 2023-12-03 14:53:27.081000             🧑  作者: Mango
给定一个字符串,编写一个函数来重新排列其中的字符,使得每个回文子字符串都可以串联起来。如果不可能,则返回空字符串。
例如,给定字符串 "aab",可以重新排列成 "aba" 的形式,这样 "aba" 和 "a" 是回文字符串,"b" 则是一个单独的回文字符串。因此,该函数应返回 "ababa"。
我们可以将字符串中每个字符出现的次数都记录下来,然后根据回文字符串的性质,每个字符的出现次数必须为偶数(或者存在一个字符出现次数为奇数,其他字符出现次数均为偶数)。因此,如果字符串中不存在一个字符出现次数为奇数,我们可以将每个字符按照它们的出现次数拼接起来组成回文字符串。
如果字符串中存在一个字符出现次数为奇数,我们需要找到这个字符,并将其放在回文字符串的中心,其它字符可以按照相同方式组合成回文字符串。如果存在多个字符出现次数为奇数,则无法组成回文字符串。
def palindrome_concat(s:str) -> str:
# 统计每个字符出现的次数
count = {}
for char in s:
count[char] = count.get(char, 0) + 1
# 判断是否可以组成回文字符串
odd_char = ""
for char, cnt in count.items():
if cnt % 2 != 0:
if odd_char != "":
return ""
odd_char = char
# 拼接回文字符串
palindrome = []
for char, cnt in count.items():
palindrome.extend([char]*(cnt//2))
result = "".join(palindrome)
return result+odd_char+result[::-1]
assert palindrome_concat("aab") == "ababa"
assert palindrome_concat("aaabb") == "ababa"
assert palindrome_concat("abc") == ""