leetcode_267 回文排列 II

676 阅读1分钟

要求

给定一个字符串 s ,返回其通过重新排列组合后所有可能的回文字符串,并去除重复的组合。

如不能形成任何回文排列时,则返回一个空列表。

示例 1:

输入: "aabb"
输出: ["abba", "baab"]

示例 2:

输入: "abc"
输出: []

核心代码

class Solution:
    def generatePalindromes(self, s: str) -> List[str]:
        if not s or not self.canPermutePalindrome(s):
            return []
        if len(set(s)) == 1:
            return [s]
        xor = s[0]
        dic = collections.Counter(s)
        news = ""
        special = ""
        for key,val in dic.items():
            if val % 2:
                special = key
                val -= 1
            news += key * (val //2)
        
        res = set()
        def permutations(word,tmp):
            if not word:
                res.add(tmp + special + tmp[::-1])
            for i,char in enumerate(word):
                permutations(word[:i] + word[i + 1:],tmp + char)
        permutations(news,"")
        return list(res)

    def canPermutePalindrome(self, s):
        flag = 0
        dic = collections.Counter(s)
        for key,val in dic.items():
            if val % 2:
                if not flag:
                    flag = 1
                else:
                    return False
        return True

image.png

解题思路:在266 回文排列 I题中我们判断了是否是回文串,在这我们引用过来,首先先对字符串判断是不是回文串,是的情况下,我们在我们将除了单独字符外的字符拼接到一起,取所有字符的一半,然后进行全排列,若存在相同的就将单独字符和剩余部分翻转拼接到一起,最终收集到所有的可能的情况。