力扣的 分割回文串 II 解法 (Python3)
题目描述:
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回符合要求的最少分割次数。
示例:
输入: “aab”
输出: 1
解释: 进行一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子串。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-partitioning-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
参考程序1:
动态规划解法
class Solution:
def minCut(self, s: str) -> int:
ls = len(s)
if ls < 2:
return 0
dp = [i for i in range(ls)]
check_palindrome = [[False for _ in range(ls)] for _ in range(ls)]
for i in range(ls):
for j in range(i + 1):
if s[j] == s[i] and (i - j <= 2 or check_palindrome[j + 1][i - 1]):
check_palindrome[j][i] = True
for i in range(1, ls):
if check_palindrome[0][i]:
dp[i] = 0
continue
# 枚举分割点
dp[i] = min([dp[j] + 1
for j in range(i)
if check_palindrome[j + 1][i]])
return dp[ls - 1]
运行结果1:
参考程序2:
class Solution:
def minCut(self, s: str) -> int:
mincut = list(range(len(s)))
ls = len(s)
dp = [[False] * ls for _ in range(ls)]
for j in range(ls):
for i in range(j+1):
if s[i] == s[j] and (j - i < 2 or dp[i + 1][j - 1]):
dp[i][j] = True
if i == 0:
mincut[j] = 0
else:
mincut[j] = min(mincut[j], mincut[i - 1] + 1)
return mincut[-1]
运行结果2:
参考程序3:
class Solution:
def minCut(self, s: str) -> int:
if len(s) < 2:
return 0
mincut = [index for index in range(-1, len(s))]
for i in range(1, len(s)+1):
for j in range(i):
if s[j:i] == s[j:i][::-1]:
mincut[i] = min(mincut[i], mincut[j]+1)
return mincut[-1]
运行结果3: