1312. 让字符串成为回文串的最少插入次数 - 力扣(LeetCode)

Solution
#include<iostream>
#include<vector>
#include<string>
using namespace std;class Solution {
public:int minInsertions1(string s) {int n = s.length();return f1(s, 0, n - 1);}int minInsertions2(string s) {int n = s.length();vector<vector<int>>dp(n + 1, vector<int>(n + 1, -1));return f2(s, 0, n - 1, dp);}int minInsertions3(string s) {return f3(s);}int minInsertions(string s) {return f4(s);}//递归做法int f1(string s, int l, int r) {if (l == r)return 0;if (l + 1 == r)return (s[l] == s[r]) ? 0 : 1;if (s[l] == s[r])return f1(s, l + 1, r - 1);else {return min(f1(s, l + 1, r) + 1, f1(s, l, r - 1) + 1);}}//带缓存表的递归int f2(string s, int l, int r, vector<vector<int>>& dp) {if (dp[l][r] != -1)return dp[l][r];int ans;if (l == r)ans = 0;else if (l + 1 == r)ans = (s[l] == s[r]) ? 0 : 1;else if (s[l] == s[r]) {ans = f2(s, l + 1, r - 1, dp);}else {ans = min(f2(s, l + 1, r, dp) + 1, f2(s, l, r - 1, dp) + 1);}dp[l][r] = ans;return ans;}//dp做法int f3(string s) {int n = s.length();vector<vector<int>>dp(n + 1, vector<int>(n + 1, 0));//base casefor (int i = 0; i < n; ++i) {dp[i][i + 1] = (s[i] == s[i + 1]) ? 0 : 1;}for (int i = n - 3; i >= 0; --i) {for (int j = i + 2; j < n; ++j) {if (s[i] == s[j]) dp[i][j] = dp[i + 1][j - 1];else dp[i][j] = min(dp[i + 1][j], dp[i][j - 1]) + 1;}}return dp[0][n - 1];}//dp+空间压缩int f4(string s) {int n = s.length();vector<int>dp(n, 0);for (int i = n - 1; i >= 0; --i) {int leftdown = 0, back;for (int j = i; j < n; ++j) {back = dp[j];if (i == j) dp[j] = 0;else if (i + 1 == j) dp[j] = (s[i] == s[j]) ? 0 : 1;else if (s[i] == s[j]) dp[j] = leftdown;else dp[j] = min(dp[j], dp[j - 1]) + 1;leftdown = back;}}return dp[n - 1];}
};int main() {return 0;
}