int minCut(string s) { int size = s.size(); if (size == 0) { return 0; } vector<int> dp(size, INT_MAX); vector<vector<bool> > isPalind(size, vector<bool>(size)); for (int i = 0; i < size; ++i) { isPalind[i][i] = true; } for(int i = 1; i < size; ++i) { for(int j = 0; j < size; ++j) { if(j+i < size) { if(s[j] == s[j+i] && ((i <= 2) || isPalind[j+1][j+i-1])) { isPalind[j][j+i] = true; } } } } dp[0] = 0; for (int i = 1; i < size; ++i) { if (isPalind[0][i]) { dp[i] = 0; } else { for (int j = 0; j < i; ++j) { if (isPalind[j + 1][i])//如果用函数判别回文,这会产生大量的重复计算! { if (dp[j] + 1 < dp[i]) { dp[i] = dp[j] + 1; } } } } } return dp[size - 1]; }
void part(vector<vector<string>>&result, vector<string>&cur, string s,int start) { if (start==s.size()){ result.push_back(cur); return; } for ( size_t i = start; i < s.size(); i++){ if (isPalind(s, start, i)){ cur.push_back(s.substr(start, i - start + 1)); part(result, cur, s, i + 1); cur.pop_back();//回溯 } } }