1312. 让字符串成为回文串的最少插入次数
给你一个字符串 s
,每一次操作你都可以在字符串的任意位置插入任意字符。
请你返回让 s
成为回文串的 最少操作次数 。
「回文串」是正读和反读都相同的字符串。
思路:
本题要求的是最少插入次数,规定dp[i][j]是从i到j的最小插入次数,此时研究dp[i][j]的构成。
当i位置和j位置元素一致的时候,可以视为i+1,j-1范围的元素两边各加一个相同的值,则插入字符次数一样,因为可以看成在已经是回文的字串变成一个更长的字串。
当i位置和j位置不同时,此时可以分情况讨论,dp[i][j]的可能构成是对(i,j-1)的回文序列加上j位置元素,则只需要再加一即可构成新的回文序列(所加的就是一个j位置的数值),同理,也可能是(i-1,j)的回文序列再加上i位置元素,此时也是加一,也可能是(i+1,j-1)位置的回文序列,在两侧分别加一个元素(一个加i位置,一个加j位置),则dp[i][j]就是上述三种情况的最小值。
初始化时每个元素自己一定是回文,故均是0开局即可。
最后返回的是(0到n-1)位置的最小切割次数,故返回dp[0][n-1]即可。
class Solution {
public:int minInsertions(string s) {int n=s.size();vector<vector<int>>dp(n,vector<int>(n,INT_MAX));for(int j=0;j<n;j++){for(int i=j;i>=0;i--){ int k=0;if(s[i]==s[j]){if(i+1<=j-1){k=dp[i+1][j-1];}}else{ if(i+1<=j-1){ k=min(dp[i+1][j-1]+2,min(dp[i+1][j]+1,dp[i][j-1]+1));}elsek=1;}dp[i][j]=min(k,dp[i][j]);}}return dp[0][n-1];}
};