思路:动态规划,回文子串必是动态规划或者从中间看
状态:dp[i][j],表示[i,j]构成回文字符串需要的最小插入次数
转移:
if(s[i]==s[j]) dp[i][j]=dp[i+1][j-1]
else if(s[i]!=s[j]) dp[i][j]=min(min(dp[i+1][j],dp[i][j-1])+1,dp[i+1][j-1]+2);
class Solution {
public:
int minInsertions(string s) {
vector<vector<int>> dp(s.size(),vector<int>(s.size(),0));
for(int i=s.size()-1;i>=0;i--)
for(int j=i+1;j<s.size();j++)
if(s[i]==s[j])
dp[i][j]=dp[i+1][j-1];
else
dp[i][j]=min(min(dp[i+1][j],dp[i][j-1])+1,dp[i+1][j-1]+2);//状态转移
return dp[0][s.size()-1];
}
};