本文主要是介绍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 += 2
(a
后插入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 += 2
(c
前插入ab
)
- 附近字符格式只能为
最终返回ans
即为答案。
- 时间复杂度 O ( l e n ( w o r d ) ) O(len(word)) O(len(word))
- 空间复杂度 O ( 1 ) O(1) O(1)
AC代码
C++
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 acif (i + 2 < word.size() && word[i + 1] == 'b' && word[i + 2] == 'c') { // abci += 2;}else if (i + 1 < word.size() && word[i + 1] == 'c') { // aci++;ans++;}else if (i + 1 < word.size() && word[i + 1] == 'b') { // abxi++;ans++;}else { // axxans += 2;}}else if (word[i] == 'b') { // xbx xbcif (i + 1 < word.size() && word[i + 1] == 'c') { // xbci++;ans++;}else { // xbxans += 2;}}else { // xxcans += 2;}}return ans;}
};
方法二:算最终是几个abc
有童鞋说这道题只有三个字符,如果有10个字符(abcdefghij)那得写多少if-else。
没办法了,换个更容易实现的方法吧。
不难发现,目标字符串abc
是递增的,只要连续两个字符是递增的,那么它们必定可以划到一个abc
中。(若连续两字符为ab
、ac
、bc
,那么他们最终会在一个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++
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
class Solution:def addMinimum(self, word: str) -> int:cntABC = 1for i in range(1, len(word)):if word[i] <= word[i - 1]:cntABC += 1return cntABC * 3 - len(word)
同步发文于CSDN,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/135531917
这篇关于LeetCode 2645.构造有效字符串的最少插入数:O(n) + O(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!