给定一个字符串,确定它的任何排列是否是回文
我试图确定任何字符串是否是回文。例如,carrace 应该返回true,因为它可以重新排列形成racecar,这是一个回文。Daily 应该返回 false,因为没有可以形成回文的重新排列。我该如何解决这个问题?
代码:
string = 'racecar'
if string[::-1] == string:
print('palindrome')
以上代码适用于单个字符串,不适用于排列
回答
当且仅当最多有一个字符出现奇数次时,字符串才能被置换为回文。
from collections import Counter
def permute_palindrome(s):
return sum(1 for i in Counter(s).values() if i%2) <= 1
assert permute_palindrome('carrace')
assert not permute_palindrome('daily')
详细解释:
任何回文最多有一个字符出现且出现次数为奇数:
考虑任何回文aabbcccbbaa
请注意,根据回文的定义,左侧的任何字符都与右侧的字符匹配,因此它与该字符形成一对。成对计算字符总是会导致偶数(2 的任何倍数都是偶数)。唯一的例外是奇数长度字符串的中间字符,该字符与自身“配对”。所以最多有一个字符出现奇数次。
任何最多一个字符出现奇数次的字符串都可以置换为回文:
我们以下列方式展示了回文 p 的构造。如果某个字符出现奇数次,则将其添加到 p。对于出现偶数次的任何字符,将其分成两部分,并将一部分添加到 p 的开头,另一部分添加到 p 的末尾。这导致回文。
例如:aabbbbccd
p = d
p = ada
p = bbadabb
p = cbbadabbc