LeetCode1312、让字符串成为回文串的最少操作次数(区间动态规划方法)

题目描述

https://leetcode-cn.com/problems/minimum-insertion-steps-to-make-a-string-palindrome/
LeetCode1312、让字符串成为回文串的最少操作次数(区间动态规划方法)_第1张图片

解法

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];
    }
}

LeetCode1312、让字符串成为回文串的最少操作次数(区间动态规划方法)_第2张图片

你可能感兴趣的:(#,LeetCode,字符串,java,leetcode,动态规划,算法)