Skip to content

1312. Minimum Insertion Steps to Make a String Palindrome

思路

  • 是一个动态规划题
  • 这个题其实是算 LPS(Longest Palindromic Subsequence),只需要计算最长的回文子序列长度,就可以知道还差几个字母。
  • 用这个字符串的长度剪去最长子序列的长度,就是需要插入的字符串数量。
  • 此外,在计算 LPS 的时候,因为递归函数经常会有重复计算,需要用一个 memo
  • lps(i, j, s, memo)代表从 i 到 j 这段长度上 s 的最长子序列长度。

代码

class Solution {
    private int lps(int i, int j, String s, int[][] memo){
        int longest = 0;
        if(memo[i][j] != 0){
            return memo[i][j];
        }
        if(i == j){
            return 1;
        }
        if(i > j){
            return 0;
        }
        if(s.charAt(i) == s.charAt(j)){
            longest = lps(i + 1, j - 1, s, memo) + 2;
        }else{
            longest = Math.max(
                lps(i + 1, j, s, memo),
                lps(i, j - 1, s, memo)
            );
        }
        memo[i][j] = longest;
        return longest;
    }

    public int minInsertions(String s) {
        int longest = lps(0, s.length() - 1, s, new int[s.length()][s.length()]);
        return s.length() - longest;
    }
}