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 II和Longest 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