题目:
解法一:动态规划
class Solution {
public int minimumOperations(String leaves) {
int n = leaves.length();
int[][] nums = new int[n][3];
// j=0第一部分为红, j=1第二部分为黄, j=2第三部分为红
nums[0][0] = leaves.charAt(0)=='y'?1:0;
nums[0][1] = nums[0][2] = nums[1][2] = Integer.MAX_VALUE;
for (int i=1; i<n; i++){
int isYellow = leaves.charAt(i)=='y'?1:0;
int isRed = leaves.charAt(i)=='r'?1:0;
nums[i][0] = nums[i-1][0] + isYellow;
nums[i][1] = Math.min(nums[i-1][0], nums[i-1][1]) + isRed;
if(i>=2){
nums[i][2] = Math.min(nums[i-1][1], nums[i-1][2]) + isYellow;
}
}
return nums[n-1][2];
}
}
解法二:前缀和+动态规划
class Solution {
public int minimumOperations(String leaves) {
int n = leaves.length();
int g = leaves.charAt(0) == 'y' ? 1 : -1;
int gmin = g;
int ans = Integer.MAX_VALUE;
for (int i = 1; i < n; ++i) {
int isYellow = leaves.charAt(i) == 'y' ? 1 : 0;
g += 2 * isYellow - 1;
if (i != n - 1) {
ans = Math.min(ans, gmin - g);
}
gmin = Math.min(gmin, g);
}
return ans + (g + n) / 2;
}
}