首页 > 其他分享 >1312. 让字符串成为回文串的最少插入次数

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

时间:2024-09-01 22:50:01浏览次数:6  
标签:1312 int 复杂度 插入 字符串 dp 回文

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

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

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

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

示例 1:

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

示例 2:

输入:s = "mbadm"
输出:2
解释:字符串可变为 "mbdadbm" 或者 "mdbabdm" 。

示例 3:

输入:s = "leetcode"
输出:5
解释:插入 5 个字符后字符串变为 "leetcodocteel" 。

提示:

  • 1 <= s.length <= 500
  • s 中所有字符都是小写字母。

动态规划

我们要计算黑框中的值:

我们要计算黑框中的值

class Solution {
    int minInsertions(String s) {
        int n = s.length();
        // dp[i][j] 表示把字符串 s[i..j] 变成回文串的最少插入次数
        // dp 数组全部初始化为 0,因为dp[i][i]是回文串,不需要插入字符。
        int[][] dp = new int[n][n];
        
        // 倒序遍历i,正序遍历j以保证正确的状态转移,这是从状态转移方程中看出来的
        for (int i = n - 2; i >= 0; i--) {
            for (int j = i + 1; j < n; 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], dp[i][j - 1]) + 1;
                }
            }
        }
        
        // 整个 s 的最少插入次数
        return dp[0][n - 1];
    }
}

时间复杂度和空间复杂度都是O(n^2)。

滚动更新

class Solution {
    int minInsertions(String s) {
        int n = s.length();
        // dp 数组用于存储当前层的状态
        int[] dp = new int[n];
        
        // 反着遍历保证正确的状态转移
        for (int i = n - 2; i >= 0; i--) {
            int prev = 0;  // 用于存储 dp[i + 1][j - 1],初始化为dp[i][i],即0。
            for (int j = i + 1; j < n; j++) {
                int temp = dp[j];  // 暂存上一轮计算出的 dp[j] 的值,即dp[i+1][j]
                // 状态转移方程,下面要计算本轮的dp[j],即dp[i][j]。
                if (s.charAt(i) == s.charAt(j)) {
                    dp[j] = prev; // dp[i][j] = dp[i+1][j-1]
                } else {
                    dp[j] = Math.min(dp[j], dp[j - 1]) + 1; // dp[i][j] = Math.min(dp[i+1][j], dp[i][j-1])+1
                }
                prev = temp;  // 更新 prev 为 dp[i+1][j],给下一轮j循环使用。
            }
        }
        
        // 整个 s 的最少插入次数
        return dp[n - 1];
    }
}
  • 时间复杂度O(n^2)。
  • 空间复杂度O(n)。

标签:1312,int,复杂度,插入,字符串,dp,回文
From: https://blog.csdn.net/weixin_45942644/article/details/141647640

相关文章

  • 58集团23校招测试工程师卷——字符串处理
    Top5热词问题为了提高用户体验,后台要对用户的搜索词进行统计以方便后续做针对性的优化升级。统计策略如下:筛选出搜索词集合中的搜索次数排名前5的搜索词(不考虑搜索词数相同情况)。输入的搜索词数据格式:化妆品导购:51,奶茶店员:70,医药连锁:27,夜班8小时店员:38,店员:97,促销......
  • Leetcode3234. 统计 1 显著的字符串的数量
    EverydayaLeetcode题目来源:3234.统计1显著的字符串的数量解法1:枚举左端点注意到,如果子串中的0非常多,多到0的个数的平方比1的个数都要大,那么这样的子串必然不是1显著子串。设cnt0为子串中的0的个数,cnt1为子串中的1的个数,那么必须满足:cnt0*cnt0<=......
  • Java:有效括号字符串验证器
    Java实现的有效括号字符串验证器引言在编程中,经常需要验证一组字符串中的括号是否正确配对。例如,检查一段代码或表达式中的圆括号、方括号和花括号是否成对出现。这类问题不仅在编程语言解析器中非常重要,也是许多软件开发场景中的基础需求。本文将介绍一种基于Java语言实......
  • 【3.10】贪心算法-找出对应 LCP 矩阵的字符串
    一、题目对任一由n个小写英文字母组成的字符串word,我们可以定义一个nxn的矩阵,并满足:lcp[i][j]等于子字符串 word[i,...,n-1]和word[j,...,n-1]之间的最长公共前缀的长度。给你一个nxn的矩阵lcp。返回与lcp对应的、按字典序最小的字符串 word。如果......
  • 高级字符串算法
    目录最长公共子串/子序列最长公共子串算法步骤代码示例复杂度分析最长公共子序列算法步骤代码示例复杂度分析正则表达式匹配正则表达式语法代码示例NFA与DFA在正则表达式匹配中的应用NFA(非确定性有限自动机)DFA(确定性有限自动机)NFA与DFA的比较字符串编辑距离(Le......
  • stdio.h及字符串输入输出
    这里只简单介绍常用的C语言常见的输入输出及字符串的输入输出,可以作为常用C语言字符串的速记收藏。#include<stdio.h>scanf //与空格,tab键及换行就阻断缓冲区printf //格式输入输出gets(数组名) //直到遇到换行键停止chararr[n];gets(arr);puts(数组名) //......
  • 【C】关于字符串与字符串函数de一些小练习
    关于字符串与字符串函数de小练习1.字符串中的最大数你需要找出十个数中最大的哪一个,但不幸的是因为一些故障,一些小写字母随机的插入了这是个数字。请忽视这十个字符串中无意义的小写字母,输出这十个数字中最大的那一个,以及它来自于哪一个字符串。输入:"a3a2dsa3f4fsa5dg......
  • HJ19 简单错误记录 || 字符串模拟
    就是字符串模拟和处理。最大的问题就是题面题意写得真的挺模糊的,好多地方有点表意不明。。1#include<bits/stdc++.h>2usingnamespacestd;3constintmaxn=110;4chara[maxn][maxn];5intb[maxn],num_qc=0,cnt[maxn],ans[maxn],num_ans=0;6boolfg[maxn],f[ma......
  • 代码随想录day46 || 647 回文子串, 516 最长回文子序列
    647回文字串funccountSubstrings(sstring)int{ //动规五部曲 //dp[i][j]表示s[i:j+1]区间是否是一个回文 //ifs[i]==s[j]{ifi-j<=1||dp[i+1][j-1]==true{dp[i][j]==true}} //初始化为false //从下往上,从左往右 //print varcountint var......
  • 字符串的处理
    消除换行符if(str[i]=='\n')str[i]='\0';scanf和cin会读取空格,而fgets不会gets_s许多编译器不支持,不建议用charstr[N]; if(fgets(str,sizeof(str),stdin)==NULL) { return1; }格式化输入输出sprintf:功能:sprintf用于将格式化的数据输出到一个字符串......