题目描述
https://leetcode-cn.com/problems/minimum-insertion-steps-to-make-a-string-palindrome/
解法
class Solution {
public int minInsertions(String s) {
if(s==null || s.length()<=1) return 0;
//将字符串分成两部分
int n = s.length();
//思考dp数组的含义,字符串问题,一般dp都是二维,表示从i到j或者最长递增子序列问题是一维
int [][]dp = new int[n][n];
//dp[i][j]表示从i到j的字符串s1,变成回文串的最少操作次数
//base case dp[i][j] i==j,不需要操作,i>j,不存在这种情况 0,java默认初始化完成
//思考递推过程, dp[i][j]可能由哪几个状态的来?
//必然是三种情况 dp[i+1][j-1] dp[i+1][j] dp[i][j-1]
//dp[i+1][j-1]表示变成回文串的最少操作数,也就是已经变成回文串了,
//当s[i]==s[j],则dp[i][j] = dp[i+1][j-1];
//当s[i]!=s[j],有哪几种情况呢?
//dp[i][j-1]变成回文串的最少操作数+一次
//dp[i+1][j]变成回文串的最少操作数+1
//dp[i+1][j-1]变成回文串的最少操作数+2
//取最小的值,但是第三种情况被包含了。
//思考dp table的递推过程,化图
for(int i=n-2;i>=0;i--){
for(int j=i;j<n;j++){
if(i<j){
if(s.charAt(i)==s.charAt(j)){
dp[i][j] = dp[i+1][j-1];
}else{
dp[i][j] = Math.min(dp[i+1][j]+1,dp[i][j-1]+1);
}
}
}
}
return dp[0][n-1];
}
}