1. 程式人生 > >LeetCode132.分割回文串2

LeetCode132.分割回文串2

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];
	}
};