我得到一个字符串,我必须确定它是否可以重新排列成回文。
例如:“aabb”为真。我们可以将“aabb”重新排列成“abba”,这是一个回文。
我想出了下面的代码,但在某些情况下会失败。问题出在哪里以及如何解决?
def palindromeRearranging(inputString):
a = sorted(inputString)[::2]
b = sorted(inputString)[1::2]
return b == a[:len(b)]
我得到一个字符串,我必须确定它是否可以重新排列成回文。
例如:“aabb”为真。我们可以将“aabb”重新排列成“abba”,这是一个回文。
我想出了下面的代码,但在某些情况下会失败。问题出在哪里以及如何解决?
def palindromeRearranging(inputString):
a = sorted(inputString)[::2]
b = sorted(inputString)[1::2]
return b == a[:len(b)]
def palindromeRearranging(inputString):
elements = {c:inputString.count(c) for c in set(inputString)}
even = [e % 2 == 0 for e in elements.values()]
return all(even) or (len(inputString) % 2 == 1 and even.count(False) == 1)
它计算每个字符出现的次数,并检查所有元素是否出现偶数次,或者输入字符串的长度是否为奇数,检查是否只有一个字符出现奇数次。
def palindromeRearranging(inputString):
return sum(map(lambda x: inputString.count(x) % 2, set(inputString))) <= 1
此代码计算字符串中每个字符的出现次数。在回文中,如果字符串长度为奇数,则有一个字符出现奇数,如果字符串长度为偶数,则没有字符出现奇数。
Python3
def palindromeArrange (string):
string = list(string)
for i in range (len(string)):
"""if the string has even element count"""
if len(string) % 2 == 0 and len(string)/2 == len (set (string)):
return True
"""if the string has odd element count"""
if len(string) - ((len(string)-1)/2) == len (set (string)):
return True
return False
在 Python3 中使用列表理解的一个班轮
return len([x for x in set(inputString) if inputString.count(x) % 2 != 0]) <= 1
基本上计算那些计数不能被 2 整除的字符。
对于偶数字符串,它将为零,而对于奇数字符串,它将是一。
我马上能想到的解决方案的时间复杂度是 O(n)。假设是,如果有多个奇数字符,则不能生成回文。
def solution(inputString):
string = list(inputString)
n = len(string)
s_set= set(string)
from collections import Counter
dic = Counter(string)
k =0 #counter for odd characters
for char in s_set:
if dic.get(char)%2!=0:
k+=1
if k>1:
return False
else:
return True