列表

详情


LCP 19. 秋叶收藏集

小扣出去秋游,途中收集了一些红叶和黄叶,他利用这些叶子初步整理了一份秋叶收藏集 leaves, 字符串 leaves 仅包含小写字符 ry, 其中字符 r 表示一片红叶,字符 y 表示一片黄叶。 出于美观整齐的考虑,小扣想要将收藏集中树叶的排列调整成「红、黄、红」三部分。每部分树叶数量可以不相等,但均需大于等于 1。每次调整操作,小扣可以将一片红叶替换成黄叶或者将一片黄叶替换成红叶。请问小扣最少需要多少次调整操作才能将秋叶收藏集调整完毕。

示例 1:

输入:leaves = "rrryyyrryyyrr"

输出:2

解释:调整两次,将中间的两片红叶替换成黄叶,得到 "rrryyyyyyyyrr"

示例 2:

输入:leaves = "ryr"

输出:0

解释:已符合要求,不需要额外操作

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int minimumOperations(string leaves) { } };

golang 解法, 执行用时: 8 ms, 内存消耗: 6.2 MB, 提交时间: 2023-01-11 10:08:28

const inf = math.MaxInt32 // 或 math.MaxInt64

func minimumOperations(leaves string) int {
    n := len(leaves)
    g := -1
    if leaves[0] == 'y' {
        g = 1
    }
    gmin := g
    ans := inf
    for i := 1; i < n; i++ {
        isYellow := boolToInt(leaves[i] == 'y')
        g += 2*isYellow - 1
        if i != n-1 {
            ans = min(ans, gmin-g)
        }
        gmin = min(gmin, g)
    }
    return ans + (g+n)/2
}

func boolToInt(b bool) int {
    if b {
        return 1
    }
    return 0
}

func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}

python3 解法, 执行用时: 576 ms, 内存消耗: 15.6 MB, 提交时间: 2023-01-11 10:08:11

# 前缀和 + 动态规划
class Solution:
    def minimumOperations(self, leaves: str) -> int:
        n = len(leaves)
        g = (1 if leaves[0] == "y" else -1)
        gmin = g
        ans = float("inf")

        for i in range(1, n):
            isYellow = int(leaves[i] == "y")
            g += 2 * isYellow - 1
            if i != n - 1:
                ans = min(ans, gmin - g)
            gmin = min(gmin, g)
        
        return ans + (g + n) // 2

python3 解法, 执行用时: 432 ms, 内存消耗: 15.7 MB, 提交时间: 2023-01-11 10:07:06

class Solution:
    def minimumOperations(self, leaves: str) -> int:
        r, ry, ryr = 1 if leaves[0] == 'y' else 0, float('inf'), float('inf')
        for i in range(1, len(leaves)):
            if leaves[i] == 'r':
                r, ry, ryr = r, min(r, ry) + 1, min(ry, ryr)
            else:
                r, ry, ryr = r + 1, min(r, ry), min(ry, ryr)+1
        return ryr

上一题