Every day a Leetcode
题目来源:2645. 构造有效字符串的最少插入数
解法1:枚举 + 数学
word 仅由字母 “a”、“b” 和 “c” 组成。

因此我们只需要每次统计相邻字符之间的编号差再减去 1(并进行一定修正),就可以得到每两个字符之间需要插入的字符个数。最后再加上首尾要补充的字符数,即为最终结果。
代码:
// 枚举 + 数学
class Solution
{
public:
int addMinimum(string word)
{
// 标记前一个字符,初始为 c
char last = 'c';
// 插入的字符数
int add = 0;
for (char &cur : word)
{
// 插入的字符数,为当前字符与前一个字符的差距值 -1
add += (cur - last - 1 + 3) % 3;
last = cur;
}
// 最后还要校验最后一个字符之后是否需要插入字符
add += ('a' - last - 1 + 3) % 3;
return add;
}
};
结果:

复杂度分析:
时间复杂度:O(n),其中 n 是字符串 word 的长度。
空间复杂度:O(1)。
解法2:动态规划

代码:
// 动态规划
class Solution
{
public:
int addMinimum(string word)
{
int n = word.length();
vector<int> dp(n + 1, 0);
// 初始化
dp[0] = 0;
// 状态转移
for (int i = 1; i <= n; i++)
{
dp[i] = dp[i - 1] + 2;
if (i > 1 && word[i - 1] > word[i - 2])
dp[i] = dp[i - 1] - 1;
}
return dp[n];
}
};
结果:

复杂度分析:
时间复杂度:O(n),其中 n 是字符串 word 的长度。
空间复杂度:O(n),其中 n 是字符串 word 的长度。
本文讨论了LeetCode问题2645,涉及如何计算由a、b和c组成的字符串中构造有效字符串所需的最少插入字符数。提供了两种方法:枚举+数学和动态规划,两种都具有O(n)的时间复杂度,但空间复杂度不同。
1321

被折叠的 条评论
为什么被折叠?



