LeetCode #409 #131 #132 2018-09-06

409. Longest Palindrome

https://leetcode.com/problems/longest-palindrome/description/

思路很简单,找到那些奇数个的字符,其中只有一个可以添加到回文串中间。
代码如下:

class Solution:
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: int
        """
        odds = sum(v & 1 for v in collections.Counter(s).values())
        return len(s) - odds + bool(odds)

131. Palindrome Partitioning

https://leetcode.com/problems/palindrome-partitioning/description/

这道题是求一个字符串中回文子串的切割,并且输出切割结果,其实是Word Break IILongest Palindromic Substring结合,该做的我们都做过了。首先我们根据Longest Palindromic Substring中的方法建立一个字典,得到字符串中的任意子串是不是回文串的字典。接下来就跟Word Break II一样,根据字典的结果进行切割,然后按照循环处理递归子问题的方法,如果当前的子串满足回文条件,就递归处理字符串剩下的子串。如果到达终点就返回当前结果。算法的复杂度跟Word Break II一样,取决于结果的数量,最坏情况是指数量级的。
代码如下:

class Solution:
    def partition(self, s):
        """
        :type s: str
        :rtype: List[List[str]]
        """
        res = []
        if not s or len(s) == 0:
            return res
        str_dict = self.getDict(s)
        self.helper(s, 0, str_dict, [], res)
        return res
        
    def helper(self, s, start, str_dict, path, res):
        if start == len(s):
            res.append(list(path))
            return
        for i in range(start, len(s)):
            if str_dict[start][i]:
                self.helper(s, i + 1, str_dict, path + [s[start:i + 1]], res)
    
    def getDict(self, s):
        str_dict = [[False for x in range(len(s))] for x in range(len(s))]
        for i in range(len(s))[::-1]:
            for j in range(i, len(s)):
                if s[i] == s[j] and ((j - i) <= 2 or str_dict[i + 1][j - 1]):
                    str_dict[i][j] = True
        return str_dict

132. Palindrome Partitioning II

参照之前文章
https://www.jianshu.com/p/4de809eb06b8

你可能感兴趣的:(LeetCode #409 #131 #132 2018-09-06)