LeetCode132.分割回文串2

心不动则不痛 提交于 2019-12-02 02:29:25

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

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!