2

我得到一个字符串,我必须确定它是否可以重新排列成回文

例如:“aabb”为真。我们可以将“aabb”重新排列成“abba”,这是一个回文。

我想出了下面的代码,但在某些情况下会失败。问题出在哪里以及如何解决?

def palindromeRearranging(inputString):
    a = sorted(inputString)[::2]
    b = sorted(inputString)[1::2]
    return b == a[:len(b)]
4

5 回答 5

3
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)

它计算每个字符出现的次数,并检查所有元素是否出现偶数次,或者输入字符串的长度是否为奇数,检查是否只有一个字符出现奇数次。

于 2020-04-02T10:50:08.253 回答
3
def palindromeRearranging(inputString):
    return sum(map(lambda x: inputString.count(x) % 2, set(inputString))) <= 1

此代码计算字符串中每个字符的出现次数。在回文中,如果字符串长度为奇数,则有一个字符出现奇数,如果字符串长度为偶数,则没有字符出现奇数。

看这里

于 2020-04-02T10:42:23.400 回答
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
于 2021-09-15T22:34:33.563 回答
0

在 Python3 中使用列表理解的一个班轮

return  len([x for x in set(inputString) if inputString.count(x) % 2 != 0]) <= 1

基本上计算那些计数不能被 2 整除的字符。

对于偶数字符串,它将为零,而对于奇数字符串,它将是一。

于 2021-11-02T20:53:53.013 回答
0

我马上能想到的解决方案的时间复杂度是 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
于 2021-12-04T19:23:39.230 回答