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

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

文章目录

  • 解题思路
  • 解决方法
  • 复杂度分析
  • 代码实现

解题思路

解决此问题需要确定如何以最小的插入次数构造一个有效的字符串。首先,我们需要确定开头的差距,然后决定中间的补足,最后决定末尾的差距。

解决方法

在确定开头的差距时,我们可以对字符a不进行任何处理,b增加1,c增加2。

对于中间位置的补足,如果当前位置是a,且下一个位置是b,则不进行任何处理;如果是c则增加1;如果是a则增加2。同理,如果当前位置是b,且下一个位置是a,+1,b,+2;如果是c,则b,+1,c,+2。

对于末尾的差距,c不处理,b增加1,a增加2。

复杂度分析

时间复杂度: O ( n ) O(n) O(n),其中n是字符串的长度。这是因为我们需要遍历整个字符串来确定每个位置的最小插入次数。

空间复杂度: O ( 1 ) O(1) O(1)。这是因为我们只使用了几个变量来存储中间结果,这些变量的大小是常数,所以空间复杂度为O(1)。

代码实现

class Solution {
public:
    int addMinimum(string word) {
        int len = word.size();
        int aMinimum = 0;
        aMinimum += abs('a' - word[0]); // 开头a不处理
        aMinimum += 'c' - word[len - 1]; // 末尾c不处理
        for (int i = 1; i < len; ++i) { // 遍历中间字符
            if (word[i - 1] - word[i] == -2 || word[i - 1] - word[i] == 1) { // 下一个字符与当前字符相差-2或1,不处理
                aMinimum += 1;
            } else if (word[i - 1] == word[i]) { // 下一个字符与当前字符相同,需要增加2或者1
                aMinimum += 2;
            } else { // 下一个字符与当前字符不同且相差大于1,需要增加1
                aMinimum += 1;
            }
        }
        return aMinimum; // 返回最小插入次数
    }
};

你可能感兴趣的:(力扣刷题,c++,leetcode)