您的位置:首页 > 其它

LeetCode之Palindrome Partitioning II

2015-07-16 19:55 267 查看
/*动态规划法。
用dp[i]表示s[0...i]的最小cut数目。令j<=i,
1)如果s[j...i]是回文串,那么dp[i] = min{dp[j-1]+1, dp[i]};
2)如果s[j...i]不是回文串,那么i...j这些子字符串无法合并,它们对减少cut数目
没有贡献,此时无需更新dp数组。
为了判断s[j...i]是否是回文串,需要用一个二维数组来记录。*/
class Solution {
public:
int minCut(string s) {
if(s.empty()) return 0;
vector<int> dp(s.size(), 0);
vector<vector<int> > f(s.size(), vector<int>(s.size(), 0));
for(int i = 0; i < s.size(); ++i){
dp[i] = i;
f[i][i] = 1;
}
for(int i = 0; i < s.size(); ++i){
for(int j = i; j >= 0; --j){
if(s[i] == s[j] && (i - j < 2 || f[j+1][i-1] == 1)){//s[j,i]是回文串
f[j][i] = 1;
dp[i] = min(j>0 ? dp[j-1]+1 : 0, dp[i]);
}
}
}
return dp[s.size()-1];
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: