LeetCode132.分割回文串2
阿新 • • 發佈:2018-11-11
leetcode132.分割回文串2(動態規劃)
狀態:dp[i]表示字串s[0...i]最少的分割次數。
狀態轉移:dp[i] = min(dp[i], dp[j-1] + 1, 0=<j<=i&&s[j...i]是迴文串)。
邊界:dp[0] = 0。
在實現的過程中可以使用快速回文法(https://blog.csdn.net/qq_22080999/article/details/80931999)。定義二維陣列p[j][i]表示s[j...i]是迴文串。通過此方法可以提高計算速度。
class Solution { public: //132.分割回文串2 bool isPali(string s, int j, int i) { while (j < i) { if (s[j] != s[i]) return false; i--; j++; } return true; } int minCut(string s) { if (s.size() < 2) return 0; vector<int> dp(s.size(), s.size()); vector<vector<bool>> p(s.size(), vector<bool>(s.size(), false)); dp[0] = 0; p[0][0] = true; for (int i = 1; i < s.size(); ++i) { for (int j = i; j >= 0; --j) { //判斷從j到i是否是迴文 //if (isPali(s, j, i)) { if (s[i] == s[j] && ((i - j < 2) || p[j + 1][i - 1])) { dp[i] = min(dp[i], j == 0 ? 0 : dp[j - 1] + 1); p[j][i] = true; } } } return dp[s.size() - 1]; } };