题目:
题解:
- 动态规划
- 本题属于516. 最大回文子序列的子题,我们直接用字符串的长度-最大回文子序列的长度就得到最少插入次数了。
- leetcode题解
代码如下:
class Solution {
public:
//题解:动态规划,dp[i][j]表示表示s[i...j]的最大回文子序列长度
//状态转移方程:若s[i]==s[j],则dp[i][j]=dp[i+1][j-1]+2;若s[i]!=s[j],则dp[i][j]=max(dp[i][j-1],dp[i+1][j])
//1、若s[i]==s[j]相等,那么它们俩的长度加上 s[i+1..j-1] 中的最长回文子序列就是 s[i..j] 的最长回文子序列
//2、若s[i]!=s[j],那么把它们两分别加入 s[i+1..j-1] 中,看看哪个子串产生的回文子序列更长即可。
//思路:字符串的长度-最大子序列的长度为最少插入次数
int minInsertions(string s) {
int n=s.size();
int dp[n][n];
memset(dp,0,sizeof(dp));
for(int i=n-1;i>=0;--i){
dp[i][i]=1;
for(int j=i+1;j<n;++j){
if(s[i]==s[j]){
dp[i][j]=dp[i+1][j-1]+2;
}
else{
dp[i][j]=max(dp[i+1][j],dp[i][j-1]);
}
}
}
return n-dp[0][n-1];
}
};