2024.1.11力扣每日一题——构造有效字符串的最少插入数

2024.1.11

      • 题目来源
      • 我的题解
        • [方法一 暴力模拟](#方法一 暴力模拟)
        • [方法二 动态规划](#方法二 动态规划)
        • [方法三 直接拼接](#方法三 直接拼接)
        • [方法四 计算组数](#方法四 计算组数)

题目来源

力扣每日一题;题序:2645

我的题解

方法一 暴力模拟

直接模拟,根据题意可知 若是abc则不用插入,若是ab,ac,bc这需要 插入一个字符,其他的则需要插入两个字符。因此使用String的替换功能,先将word中的所有abc替换成 _ ,然后再分别将ab,ac,bc从左到右替换成 _ ,最后统计剩下的字符中 a b c的数量
时间复杂度 :O( n 2 n^2 n2) n是字符串的长度。除了遍历的O(n),还有替换方法内部的O(n)
空间复杂度:O(1)

java 复制代码
public int addMinimum(String word) {
   word=word.replaceAll("abc","_");
    int n=word.length();
    if(n==0)
        return 0;
    int res=0;
    while(word.contains("ab")){
        res++;
        word=word.replaceFirst("ab","_");
    }
    while(word.contains("bc")){
        res++;
        word=word.replaceFirst("bc","_");
    }
    while(word.contains("ac")){
        res++;
        word=word.replaceFirst("ac","_");
    }
    for(int i=0;i<word.length();i++){
        char ch=word.charAt(i);
        if(ch>='a'&&ch<='c'){
            res+=2;
        }
    }
    return res;
}
方法二 动态规划

定义dpi状态表示前i个字符凑成若干个abc所需插入的字符数,则转移过程:

  • 若第i个字符单独在一组abc中,则dpi=dpi-1+2
  • 若wordi>wordi-1则表示wordi和wordi-1在一组abc中,则dpi=dpi-1-1
    时间复杂度:O(n)

空间复杂度:O(n)

java 复制代码
public int addMinimum(String word) {
  int n=word.length();
  int[] dp=new int[n+1];
   for(int i=0;i<n;i++){
       dp[i+1]=dp[i]+2;
       if(i<n-1&&word.charAt(i+1)>word.charAt(i)){
           dp[i+1]=dp[i]-1;
       }
   }
   return dp[n];
}

当然,可以发现转移至于i-1状态有关,所以可以使用滚动数组优化空间

java 复制代码
public int addMinimum(String word) {
    int n=word.length();
    int dp_0=0;
    int dp_1=0;
    for(int i=0;i<n;i++){
        dp_1=dp_0+2;
        if(i<n-1&&word.charAt(i+1)>word.charAt(i)){
            dp_1=dp_0-1;
        }
        dp_0=dp_1;
    }
    return dp_1;
}
方法三 直接拼接

参考:官方题解

当前字符小于等于前面字符说明它们一定不在同一组 abc 中,只需要添置若干字符过渡这两者即可。例如 b前面是 c,则需要在中间添置 a,又例如 b 前面是 b,则需要在中间添置 ca。

以上两种情况可以用一个模型来表示,设当前字符是 x,前面字符是 y,那么需要添置的字符个数为 (x−y−1+3)mod  3。其中 +3 再对 3取模,可以应对 x 小于等于 y 的情况。

最后还需要处理头尾两个字符,word0 前面添置 word0−'a′ 个字符,wordn−1后面添置 'c′−wordn−1个字符。两个可以合并为 word0−wordn−1+2
时间复杂度:O(n)

空间复杂度:O(1)

java 复制代码
 public int addMinimum(String word) {
   int n=word.length();
    int res=0;
    if(n==1)
        return 2;
    res+=word.charAt(0)-word.charAt(n-1)+2;
    for(int i=0;i<n-1;i++){
        int count=word.charAt(i+1)-word.charAt(i)-1+3;
        res+=count%3;
    }
    return res;
  
}
方法四 计算组数

计算递增序列的组------也就是每一个递增序列都是一个组,然后使用一个变量count记录当前递增序列的长度,需要插入的字符数=3-count。在不满足递增的时候才会计算需要插入的字符数,并且重置count。
时间复杂度:O(n)。n是word的长度

空间复杂度:O(1)

java 复制代码
public int addMinimum(String word) {
    int n=word.length();
    if(n==1){
        return 2;
    }
    int res=0;
    int count=1;
    for(int i=0;i<n-1;i++){
        if(word.charAt(i+1)<=word.charAt(i)){
            res+=3-count;
            count=1;
        }else{
            count++;
        }
    }
    return res+(3-count);
  
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

相关推荐
weixin_440784116 小时前
【HandlerThread实现原理】
android·java·开发语言
leoZ2316 小时前
本地跑大模型实战(七):llama.cpp 性能调优,让推理更快更省
java·人工智能·spring·生成对抗网络·语言模型·自然语言处理·llama
mubei-1237 小时前
SpringDAO的用法
java·开发语言·数据库
happymagic8 小时前
java spring boot做的jar包程序,如何实现自动运行启动
java·运维·服务器·spring boot·jar
小程故事多_808 小时前
从A2C、TRPO、PPO到GRPO,强化学习策略梯度算法完整演进与大模型落地实战解析
人工智能·算法
2601_956121979 小时前
二分算法(知识点+题目)
c++·算法
都叫我大帅哥10 小时前
给 Java 程序员的 CSRF 攻击详解:从原理到防御实战
java
江南十四行10 小时前
Spring框架核心(上)——IoC控制反转与DI依赖注入详解
java·后端·spring
fb_1234511 小时前
Linux磁盘分区从入门到实操:MBR_GPT全解析+分区工具实战指南
java·linux·gpt
码智社12 小时前
JSON 零基础到资深全体系教程
java·json