1 动态规划
本题解法与《Leetcode|线性序列|516. 最长回文子序列》高度相似
【dp
数组含义】:子串s[i, j]
最少需要dp[i][j]
次插入次数
【状态转移方程】:
- 两字符相等
dp[i][j] = dp[i 1][j - 1];
- 两字符不等——则需考虑
s[i 1,j]
和s[i,j - 1]
dp[i][j] = min(dp[i 1][j], dp[i][j - 1]) 1;
代码语言:javascript复制class Solution {
public:
int minInsertions(string s) {
int size = s.size();
// dp数组含义:子串s[i, j]最少需要dp[i][j]次插入次数
vector<vector<int>> dp(size, vector<int>(size, 0));
for (int i = size - 1; i >= 0; i--)
for (int j = i 1; j < size; j ) {
// 1.如果两字符相同
if (s[i] == s[j])
dp[i][j] = dp[i 1][j - 1];
// 2.如果两字符不同——则需考虑s[i 1,j]和s[i,j - 1]
else
dp[i][j] = min(dp[i 1][j], dp[i][j - 1]) 1;
}
return dp[0][size - 1];
}
};