难度困难
给你一个字符串 s
,请你将 s
分割成一些子串,使每个子串都是回文。
返回符合要求的 最少分割次数 。
示例 1:
输入:s = "aab" 输出:1 解释:只需一次分割就可将 s 分割成 ["aa","b"] 这样两个回文子串。
示例 2:
输入:s = "a" 输出:0
示例 3:
输入:s = "ab" 输出:1
提示:
1 <= s.length <= 2000
s
仅由小写英文字母组成
思路
题目要求最小分割次数那么动态规划是一种求这种最值常用的方法
设 f[i]是 s[0..i]分割成回文子串的最小分割次数
初始化 f[i]都为INT_MAX
f[i]= { min( f[j]+1) if s[j+1..i]是回文串 , 0<=j<i} //也就是在j/j+1处分割
if s[0...i]是回文串 f[i]=0
设回文串 palindrome p[i][j]表示s[i][j]是否是回文串 ,bool类型
s[i][j]= s[i-1][j-1] && (s[i]==s[j])
但需要考虑 ,如果不满足 i-1<=j-1 情况下则 s[i][j]= (s[i]==s[j]) 也可以直接一开始全部赋值true再改变
代码