Palindrome Permutation

只能有一个字母的次数是奇数次或者没有的字符串才能重构成对称字符串

class Solution(object):
    def canPermutePalindrome(self, s):
        """
        :type s: str
        :rtype: bool
        """
        return len([char for char, value in collections.Counter(s).items() if value % 2]) <= 1

Palindrome Permutation II

这道题有一个查重策略的问题,看起来好像各个排列是不一样的,但是实际上因为有奇数个字母的存在导致了可能有重复的方法出现(猜的?),最暴力的方法就是用一个set直接帮我们踢掉重复结果了

class Solution(object):
    def generatePalindromes(self, s):
        """
        :type s: str
        :rtype: List[str]
        """
        store = collections.Counter(s)
        if len([char for char, value in store.items() if value % 2]) > 1:
            return []

        result = set([])
        self.helper('', result, store)
        return list(result)

    def helper(self, tmp, result, store):
        if not store.keys():
            result.add(tmp[:])
            return

        for char in store.keys():
            if store[char] % 2:
                store[char] -= 1
                if not store[char]:
                    store.pop(char)
                self.helper(tmp[:len(tmp) / 2] + char + tmp[len(tmp) / 2:], result, store)
                store[char] += 1
            else:
                store[char] -= 2
                if not store[char]:
                    store.pop(char)
                self.helper(char + tmp + char, result, store)
                store[char] += 2

这里通过另外一种方法验证了上面的猜测即只有有奇数个同字符出现的字符串在排列时会产生重复问题,既然如此,我们就先把这个多出来的字符先放在中间就好了,这样就避免了额外去重

class Solution(object):
    def generatePalindromes(self, s):
        """
        :type s: str
        :rtype: List[str]
        """
        store = collections.Counter(s)
        checker = [char for char, value in store.items() if value % 2]
        if len(checker) > 1:
            return []

        tmp = ''
        if checker:
            tmp += checker[0]
            store[checker[0]] -= 1
            if not store[checker[0]]:
                store.pop(checker[0])

        result = []
        self.helper(tmp, result, store)
        return result

    def helper(self, tmp, result, store):
        if not store.keys():
            result.append(tmp[:])
            return

        for char in store.keys():
            store[char] -= 2
            if not store[char]:
                store.pop(char)
            self.helper(char + tmp + char, result, store)
            store[char] += 2

results matching ""

    No results matching ""