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

猜你喜欢

转载自blog.csdn.net/Gentlemanman/article/details/83714335