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
网友评论