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 的长度。