class Solution {
public:
int minimumOperations(string leaves) {
}
};
LCP 19. 秋叶收藏集
小扣出去秋游,途中收集了一些红叶和黄叶,他利用这些叶子初步整理了一份秋叶收藏集 leaves
, 字符串 leaves
仅包含小写字符 r
和 y
, 其中字符 r
表示一片红叶,字符 y
表示一片黄叶。
出于美观整齐的考虑,小扣想要将收藏集中树叶的排列调整成「红、黄、红」三部分。每部分树叶数量可以不相等,但均需大于等于 1。每次调整操作,小扣可以将一片红叶替换成黄叶或者将一片黄叶替换成红叶。请问小扣最少需要多少次调整操作才能将秋叶收藏集调整完毕。
示例 1:
输入:
leaves = "rrryyyrryyyrr"
输出:
2
解释:调整两次,将中间的两片红叶替换成黄叶,得到 "rrryyyyyyyyrr"
示例 2:
输入:
leaves = "ryr"
输出:
0
解释:已符合要求,不需要额外操作
提示:
3 <= leaves.length <= 10^5
leaves
中只包含字符 'r'
和字符 'y'
原站题解
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