1. 题目描述
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回符合要求的最少分割次数。
示例:
输入: “aab”
输出: 1
解释: 进行一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子串。
2. 思路
如果返回所有可能的分割结果,在计算最少分割数,会超时。因此采用动态规划。dp[i]表示前i+1个字符构成的字符串所需要的最少分割数。
动态规划的数组初始化为dp[i] = i,0<= i < len(s)。当s[j:i+1]是回文串的时候,dp[i] = min(dp[i],dp[j-1] + 1)(找到在前i+1个字符中,最小的分割次数)。当整个字符串是回文串时,直接返回0
2.1 python代码
class Solution:
def minCut(self, s: str) -> int:
if s == "" or len(s) == 0:
return 0
n = len(s)
dp = [i for i in range(n)]
for i in range(1,n):
if self.isPalindrome(s[:i+1]): # 如果前i+1个字符就是回文串,就不用分割了
dp[i] = 0
else:
for j in range(i+1): # 不断找可能的分割点
if self.isPalindrome(s[j:i+1]):
dp[i] = min(dp[i],dp[j-1] +1) # 不断找最小的分割次数
return dp[-1]
def isPalindrome(self,s): # 判断是不是回文串
if s != s[::-1]:
return False
return True