【LeetCode每日一题】2645. 构造有效字符串的最少插入数(计算组数+动态规划+考虑相邻字母)

2024-1-11

文章目录

2645. 构造有效字符串的最少插入数

方法一:计算组数

1.用count统计,能构成几组abc

2.如果当前字符大于之前字符,说明还在组内,不更新

3.如果当前字符小于等于之前字符,说明不是同一组的abc,组数更新

4.最终返回值:组数*3,再减去原本的字符数,就是要插入的次数

java 复制代码
    //2645. 构造有效字符串的最少插入数---计算组数
    public int addMinimum2(String word) {
        int n = word.length();
        int count = 1;
        //最终构成abc的组数
        for (int i = 1; i < n; i++) {
            if (word.charAt(i - 1) >= word.charAt(i)) {
                //当前字符小于等于之前字符
                count++;
                //组数加一
            }
        }
        return count*3-n;
        //返回最终构成abc的总数-原本字符,即为要插入的次数
    }
方法二:动态规划

1.从1开始,d[i]为前i个字符拼成abc需要的最小插入数

2.情况一:word[i]单独存在于一组abc中,需要插两次,才能组成abc.插入次数为之前的次数+2

3.情况二:当前字符比前一个字符大,需要插一次,就可以组成abc.修改当前插入次数为:之前的次数-1,因为之前插入的两次中已经包含了当前字符。

java 复制代码
    public int addMinimum(String word) {
        int n = word.length();
        int[] d = new int[n + 1];
        //d[]数组用来统计,1到n的插入次数
        //从1开始,d[i]为前i个字符拼成abc需要的最小插入数。
        for (int i = 1; i <= n; i++) {
            d[i] = d[i - 1] + 2;
            //word[i]单独存在于一组abc中,在之前情况的基础上+2. eg: a+bc / b+ac / c+ab
            if (i > 1 && word.charAt(i - 1) > word.charAt(i - 2)) {
                //如果当前字符比前一个字符大,eg:ab/ ac / bc
                d[i] = d[i - 1] - 1;
                //当前字符和之前的字符在同一个abc中,重新覆盖d[i],前一个位置的插入数-1
            }
        }
        return d[n];
    }
方法三: 考虑相邻字母

1.设当前字符为x,前一个字符为y,

2.x大于y的情况:x-y-1

3.x小于等于y的情况:(x-y-1+3)mod 3 ,将计算的结果控制在0-2之间

4.开头的单独一个字符:word[0]-'a' ,结尾的一个字符:'c'-word[n-1],合并为word[0]-word[n-1]+2

java 复制代码
    public int addMinimum3(String word) {
        int n = word.length();
        int res = word.charAt(0) - word.charAt(n - 1) + 2;
        //合并处理开头和结尾的情况
        for (int i = 1; i < n; i++) {
            res += (word.charAt(i) - word.charAt(i - 1) + 2) % 3;
        }
        return res;
    }

1-11 生日快乐

点击移步博客主页,欢迎光临~

相关推荐
User_芊芊君子几秒前
【Java】设计模式——单例、工厂、代理模式
java·设计模式·代理模式
共享家952718 小时前
优先搜索(DFS)实战
算法·leetcode·深度优先
flashlight_hi20 小时前
LeetCode 分类刷题:2563. 统计公平数对的数目
python·算法·leetcode
楼田莉子20 小时前
C++算法专题学习:栈相关的算法
开发语言·c++·算法·leetcode
dragoooon3421 小时前
[数据结构——lesson3.单链表]
数据结构·c++·leetcode·学习方法
轮到我狗叫了21 小时前
力扣.1054距离相等的条形码力扣767.重构字符串力扣47.全排列II力扣980.不同路径III力扣509.斐波那契数列(记忆化搜索)
java·算法·leetcode
dragoooon341 天前
[优选算法专题二滑动窗口——串联所有单词的子串]
数据结构·c++·学习·算法·leetcode·学习方法
刃神太酷啦1 天前
C++ 异常处理机制:从基础到实践的全面解析----《Hello C++ Wrold!》(20)--(C/C++)
java·c语言·开发语言·c++·qt·算法·leetcode
薰衣草23331 天前
滑动窗口(2)——不定长
python·算法·leetcode
YuTaoShao2 天前
【LeetCode 每日一题】1277. 统计全为 1 的正方形子矩阵
算法·leetcode·矩阵