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);
  
}

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

相关推荐
唐青枫33 分钟前
Java SLF4J 实战指南:从日志门面到 Logback、MDC 和链路追踪
java
jvmind_dev1 小时前
Java GC 实战指南(番外篇):被忽视的隐形杀手 —— Class Unloading 如何拖垮 GC
java·后端
可编程芯片开发1 小时前
基于MPPT最大功率跟踪的离网光伏发电系统Simulink建模与仿真
算法
An_s1 小时前
机器学习python之识别图中物品信息
java·linux·开发语言
AI科技星1 小时前
线性算子不是空间映射函数,是全域双螺旋场之间拉伸、旋转、耦合、坍缩的跨空间标准化变换载体《全域数学vs传统数学:人类文明进阶200讲》第80讲
线性代数·算法·矩阵·数据挖掘·回归·乖乖数学·全域数学
米罗篮1 小时前
矩阵快速幂 (Exponentiation By Squaring Applied To Matrices)
c++·线性代数·算法·矩阵
dream_home84071 小时前
图像算法模型NPU适配与算法服务实战指南
人工智能·python·算法·npu 图像服务
AIGS0012 小时前
跨越语义鸿沟:企业本体语义平台的构建与落地
java·人工智能·python·机器学习·人工智能ai大模型应用
大鱼>2 小时前
多宠物家庭智能管理平台:云端架构与多设备协同实战
python·算法·iot·宠物
蓝田~3 小时前
大模型本地部署与远程调用 — 从 API 到 Agent
java·人工智能·claude·claude code