原题地址:https://leetcode-cn.com/problems/palindrome-partitioning-ii/description/
题目描述:
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回符合要求的最少分割次数。
示例:
输入: "aab"
输出: 1
解释: 进行一次分割就可将 s 分割成 ["aa","b"] 这样两个回文子串。
解题方案:
动态规划的题目对逻辑性要求真的很高,面对这种题型,把它当成高中数列数学题就行了。由前面已经得到的结果推出当前位置的结果,由前项元素推得后项元素的结果。在推导后项元素的结果时,需要考虑全所有的情况,才能不会出错。
其次,构建动态规划的模型,即数组也是很关键的。
class Solution {
public:
int isPalin(string& str, int begin, int end) {
while (begin < end)
if (str[begin] != str[end])
return 0;
else {
begin++; end--;
}
return 1;
}
int minCut(string s) {
if (s.size() <= 1) return 0;
int dp[s.size()];
for (int i = 0; i < s.size(); i++) {
dp[i] = isPalin(s, 0, i) == 1? 0:i;
for (int j = 1; j <= i; j++)
if (isPalin(s, j, i))
dp[i] = min(dp[i], dp[j - 1] + 1);
}
return dp[s.size() - 1];
}
};