题目描述:
Given a string s, partition s such that every substring of the partition is a palindrome.
Return the minimum cuts needed for a palindrome partitioning of s.
For example, given s ="aab",
Return1since the palindrome partitioning["aa","b"]could be produced using 1 cut.
解题思路:
- 本题的题意是求给定字符串可分割成回文串的最小分割数
- 这题符合多阶段决策模型,所以考虑用动态规划来求解
- 设置一个 dp 数组,依次截取原字符串的字串来判断当前字符串的分隔条件
- 设立一个单独函数来判断当前字符串是否为回文串
代码如下:
public int minCut(String s) {
int [] dp = new int[s.length()];
// 依次截取前 i 个字符作为当前字符串
for(int i = 0; i < s.length(); i++){
// 如果当前字符串是回文串,那么它的可分割数是 0,否则先假设是最大的分割数 i
dp[i] = isHuiwen(s.substring(0,i + 1)) ? 0: i;
// 如果当前字符串的可分割数为 0,那么它是符合题意的解,故跳过
if(dp[i] == 0) continue;
// 如果当前字符串的可分割数不是 0,则需要依次截取当前字符串的子字符串判断
for(int j = 1; j <= i; j++){
// 如果当前字符串是回文串,那么它的可分割数就需要重新给定
if(isHuiwen(s.substring(j,i + 1)))
// 状态转移方程
dp[i] = Math.min(dp[i],dp[j - 1] + 1);
// 如果不是回文串,就需要重新给定值
else
dp[i] = Math.min(dp[i],dp[j - 1] + i + 1 - j);
}
}
return dp[dp.length - 1];
}
// 判断当前字符串是否为回文串
private boolean isHuiwen(String s){
boolean flag = true;
int i = 0;
int j = s.length() - 1;
while(i < j){
if(s.charAt(i) != s.charAt(j)){
flag = false;
break;
}
i++;
j--;
}
return flag;
}