1312. 让字符串成为回文串的最少插入次数

简介: 1312. 让字符串成为回文串的最少插入次数

@TOC


1312. 让字符串成为回文串的最少插入次数

给你一个字符串 s ,每一次操作你都可以在字符串的任意位置插入任意字符。

请你返回让 s 成为回文串的 最少操作次数 。

「回文串」是正读和反读都相同的字符串。

示例 1:

输入:s = "zzazz"
输出:0
解释:字符串 "zzazz" 已经是回文串了,所以不需要做任何插入操作。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-insertion-steps-to-make-a-string-palindrome
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

动态规划,范围尝试模型
dpi:str从i到j需要插入多少个字符形成回文串
在这里插入图片描述左下半区没用,对角线填0
在这里插入图片描述
倒数第二条对角线L==R-1
相等就埴0个,不等就埴1个

普遍位置:
dpi有3种情况
在这里插入图片描述

1)假设i到j-1都已经是回文串,我们只需在i-1位置加上j的字符
dpi+1
在这里插入图片描述

2)假设i+1到j都已经是回文串,我们只需在i位置加上j的字符
即dpi+1+1
在这里插入图片描述
3)假设i+1到j-1都已经是回文串,并且i与j相等
dpi

代码

class Solution {
    public int minInsertions(String s) {
        char[] str=s.toCharArray();
        int n=str.length;
        if(n==0||n==1){
            return 0;
        }
        int[][] dp=new int[n][n];
        for(int i=0;i<n-1;i++){
            dp[i][i+1]=str[i]==str[i+1]?0:1;
        }
        for(int i=n-3;i>=0;i--){
            for(int j=i+2;j<n;j++){
                dp[i][j]=Math.min(dp[i+1][j],dp[i][j-1])+1;
                if(str[i]==str[j]){
                    dp[i][j]=Math.min(dp[i][j],dp[i+1][j-1]);
                }
            }
        }
        return dp[0][n-1];
    }
}
相关文章
|
2月前
|
存储 算法 索引
|
3月前
计算字符串中子串出现的次数
【7月更文挑战第9天】计算字符串中子串出现的次数。
38 12
|
5月前
|
算法 测试技术 C#
【线段树】2213. 由单个字符重复的最长子字符串
【线段树】2213. 由单个字符重复的最长子字符串
|
存储 算法 安全
LeetCode - #3 最长未重复子字符串
我们社区从本期开始会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。))的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。
​判断给定字符序列是否是回文
​判断给定字符序列是否是回文
70 0
|
Java
给定一个字符串和一个子串。子串中的字符可能重复,输出子串出现的次数。(Java实现)
给定一个字符串和一个子串。子串中的字符可能重复,输出子串出现的次数。(Java实现)
112 0
给定一个字符串和一个子串。子串中的字符可能重复,输出子串出现的次数。(Java实现)
C/C++编程题之删除字符串中出现次数最少的字符
实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
|
算法
【Day34】LeetCode算法 -- 3. 无重复字符的最长子串
学习LeetCode算法 -- 3. 无重复字符的最长子串。
135 0
【Day34】LeetCode算法 -- 3. 无重复字符的最长子串