📌  相关文章
📜  要插入的最小字符数,以使三个连续字符都不相同(1)

📅  最后修改于: 2023-12-03 15:11:55.836000             🧑  作者: Mango

如何获取要插入的最小字符数,以使三个连续字符都不相同

要插入的最小字符数,以使三个连续字符都不相同,可以通过以下方式获取:

方法一:遍历字符串
  1. 遍历整个字符串,每次比较当前字符和前两个字符是否相同。
  2. 如果当前字符与前两个字符有一个或两个相同,则需要在当前位置插入一个不同的字符。
  3. 记录需要插入的字符数。

示例代码:

def min_insertions(s: str) -> int:
    res = 0
    n = len(s)
    for i in range(2, n):
        if s[i] == s[i-1] == s[i-2]:
            res += 1
            continue
        if i > 2 and s[i] == s[i-2] and s[i-1] == s[i-3]:
            res += 1
    return res

时间复杂度为O(n),空间复杂度为O(1)。

方法二:动态规划
  1. 定义dp[i]为在s[:i]中插入字符使得没有三个相同字符的最小次数。
  2. 如果s[i]和s[i-1]不同,那么dp[i]就等于dp[i-1]。
  3. 如果s[i]和s[i-1]相同,那么我们需要判断s[i-2]是否与s[i-1]相同。如果相同,那么我们需要在s[i]处插入一个不同的字符。此时dp[i] = dp[i-1] + 1。否则,我们只需要让s[i]不同于s[i-1]即可,此时dp[i] = dp[i-2] + 1。

示例代码:

def min_insertions(s: str) -> int:
    n = len(s)
    dp = [0] * n
    for i in range(1, n):
        if s[i] != s[i-1]:
            dp[i] = dp[i-1]
        else:
            if i >= 2:
                dp[i] = dp[i-2] + 1
            else:
                dp[i] = 1
    return dp[-1]

时间复杂度为O(n),空间复杂度为O(n)。

以上两种方法都能够有效地计算出要插入的最小字符数,以使三个连续字符都不相同。视具体情况选择合适的方法即可。