1745. 分割回文串 IV

1745. 分割回文串 IV


题目链接:1745. 分割回文串 IV

代码如下:

//参考链接:https://leetcode.cn/problems/palindrome-partitioning-iv/solutions/3589992/zhi-jie-diao-yong-1278-ti-dai-ma-pythonj-u7pw
class Solution {
public:
	bool checkPartitioning(string s) {
		return palindromePartition(s, 3) == 0;
	}
private:
	int palindromePartition(string s, int k) {
		int n = s.size();
		vector<vector<int>> memo_change(n, vector<int>(n, -1));//-1表示没有计算过
		//把s[i:j]变成回文串的最小代价
		auto minChange = [&](auto&& minChange, int i, int j)->int {
			if (i >= j) {//字串只有一个字母,或者字串是空串
				return 0;//无需修改
			}
			int& res = memo_change[i][j];
			if (res != -1) {//之前计算过
				return res;
			}
			return res = minChange(minChange, i + 1, j - 1) + (s[i] != s[j]);
			};

		vector<vector<int>> memo_dfs(k, vector<int>(n, -1));
		//把s[:r+1]切i刀,分成i+1个子串,每个子串改成回文串的最小总修改次数
		auto dfs = [&](auto&& dfs, int i, int r) {
			if (i == 0) {//只有一个子串
				return minChange(minChange, 0, r);
			}
			int& res = memo_dfs[i][r];
			if (res != -1) {//之前计算过
				return res;
			}
			res = INT_MAX;
			//枚举子串左端点 l
			for (int l = i;l <= r;l++) {
				res = min(res, dfs(dfs, i - 1, l - 1) + minChange(minChange, l, r));
			}
			return res;
			};

		return dfs(dfs, k - 1, n - 1);
	}
};

你可能感兴趣的:(leetcode,c++)