LeetCode 2645.构造有效字符串的最少插入数:O(n) + O(1)

【LetMeFly】2645.构造有效字符串的最少插入数:O(n) + O(1)

力扣题目链接:https://leetcode.cn/problems/minimum-additions-to-make-valid-string/

给你一个字符串 word ,你可以向其中任何位置插入 "a"、"b" 或 "c" 任意次,返回使 word 有效 需要插入的最少字母数。

如果字符串可以由 "abc" 串联多次得到,则认为该字符串 有效

示例 1:

复制代码
输入:word = "b"
输出:2
解释:在 "b" 之前插入 "a" ,在 "b" 之后插入 "c" 可以得到有效字符串 "abc" 。

示例 2:

复制代码
输入:word = "aaa"
输出:6
解释:在每个 "a" 之后依次插入 "b" 和 "c" 可以得到有效字符串 "abcabcabc" 。

示例 3:

复制代码
输入:word = "abc"
输出:0
解释:word 已经是有效字符串,不需要进行修改。 

提示:

  • 1 <= word.length <= 50
  • word 仅由字母 "a"、"b" 和 "c" 组成。

方法一:if-else

从前到后遍历字符串,并补充最少的字符使所有字符都变成abc

  • 如果当前字符为a
    • 如果附近字符格式为axx,则ans += 2a后插入bc
    • 如果附近字符格式为abx,则ans++; i++;ab后插入c
    • 如果附近字符格式为abc,则i += 2
    • 如果附近字符格式为ac,则ans++; i++;ac中插入b
  • 如果当前字符为b
    • 如果附近字符格式为xbx,则ans += 2;b前后插入ac
    • 如果附近字符格式为xbc,则ans++; i++;b前插入a
  • 如果当前字符为c
    • 附近字符格式只能为xxc,则ans += 2c前插入ab

最终返回ans即为答案。

  • 时间复杂度 O ( l e n ( w o r d ) ) O(len(word)) O(len(word))
  • 空间复杂度 O ( 1 ) O(1) O(1)

AC代码

C++
cpp 复制代码
class Solution {
public:
    int addMinimum(string word) {
        int ans = 0;
        for (int i = 0; i < word.size(); i++) {
            if (word[i] == 'a') {  // axx abx abc ac
                if (i + 2 < word.size() && word[i + 1] == 'b' && word[i + 2] == 'c') {  // abc
                    i += 2;
                }
                else if (i + 1 < word.size() && word[i + 1] == 'c') {  // ac
                    i++;
                    ans++;
                }
                else if (i + 1 < word.size() && word[i + 1] == 'b') {  // abx
                    i++;
                    ans++;
                }
                else {  // axx
                    ans += 2;
                }
            }
            else if (word[i] == 'b') {  // xbx xbc
                if (i + 1 < word.size() && word[i + 1] == 'c') {  // xbc
                    i++;
                    ans++;
                }
                else {  // xbx
                    ans += 2;
                }
            }
            else {  // xxc
                ans += 2;
            }
        }
        return ans;
    }
};

方法二:算最终是几个abc

有童鞋说这道题只有三个字符,如果有10个字符(abcdefghij)那得写多少if-else。

没办法了,换个更容易实现的方法吧。

不难发现,目标字符串abc是递增的,只要连续两个字符是递增的,那么它们必定可以划到一个abc中。(若连续两字符为abacbc,那么他们最终会在一个abc中)。

否则(第二个字符≤第一个字符),相邻两个字符只能处在两个abc中。

因此,我们只需要遍历以便字符串,看相邻两个字符中第二个字符≤第一个字符的个数,就能知道最终有多少个abc

最终abc的个数乘3减去现有字符串长度即为要添加的字符的个数。

  • 时间复杂度 O ( l e n ( w o r d ) ) O(len(word)) O(len(word))
  • 空间复杂度 O ( 1 ) O(1) O(1)

AC代码

C++
cpp 复制代码
class Solution {
public:
    int addMinimum(string word) {
        int cntABC = 1;
        for (int i = 1; i < word.size(); i++) {
            if (word[i] <= word[i - 1]) {
                cntABC++;
            }
        }
        return cntABC * 3 - word.size();
    }
};
Python
python 复制代码
class Solution:
    def addMinimum(self, word: str) -> int:
        cntABC = 1
        for i in range(1, len(word)):
            if word[i] <= word[i - 1]:
                cntABC += 1
        return cntABC * 3 - len(word)

同步发文于CSDN,原创不易,转载经作者同意后请附上原文链接哦~

Tisfy:https://letmefly.blog.csdn.net/article/details/135531917

相关推荐
全糖可乐气泡水5 分钟前
Codex适配国产信创环境安装部署与技术适配全解析
开发语言·git·python·算法·百度
h_a_o777oah18 分钟前
状态机+划分型 DP :深度解析K-划分问题下 DP 状态的转移逻辑(洛谷P2679 P2331 附C++代码)
c++·算法·动态规划·acm·状态机dp·划分型dp·滚动数组优化
05候补工程师24 分钟前
从算法理想向工程现实的跨越:SLAM 核心架构、思维误区与 Nav2 实战避坑指南
人工智能·算法·安全·架构·机器人
手写码匠2 小时前
Android 17 适配实战指南:新特性解读、隐私变更与迁移全攻略
人工智能·深度学习·算法·aigc
珊瑚里的鱼2 小时前
leetcode42雨水
算法·leetcode
水木流年追梦2 小时前
大模型入门-大模型的推理策略
开发语言·python·算法·正则表达式·prompt
生成论实验室2 小时前
用事件关系网络重新理解AI(三):激活函数、微调与元学习
人工智能·学习·算法·语言模型·可信计算技术
Narv工程师2 小时前
嵌入式机器人控制器算力评估:从DMIPS到WCET的完整指南
人工智能·算法·机器学习
蒟蒻的贤2 小时前
实训1227
算法
liulilittle3 小时前
TCP UCP:基于卡尔曼滤波的BBR增强型拥塞控制算法
linux·网络·c++·tcp/ip·算法·c·通讯