小扣出去秋游,途中收集了一些紅葉和黃葉,他利用這些葉子初步整理了一份秋葉收藏集 leaves, 字符串 leaves 僅包含小寫字符 r 和 y, 其中字符 r 表示一片紅葉,字符 y 表示一片黃葉。
出于美觀整齊的考慮,小扣想要將收藏集中樹葉的排列調整成「紅、黃、紅」三部分。每部分樹葉數量可以不相等,但均需大于等于 1。每次調整操作,小扣可以將一片紅葉替換成黃葉或者將一片黃葉替換成紅葉。請問小扣最少需要多少次調整操作才能將秋葉收藏集調整完畢。
示例 1:輸入:leaves = "rrryyyrryyyrr"輸出:2解釋:調整兩次,將中間的兩片紅葉替換成黃葉,得到 "rrryyyyyyyyrr"示例 2:輸入:leaves = "ryr"輸出:0解釋:已符合要求,不需要額外操作提示:3 <= leaves.length <= 10^5
leaves 中只包含字符 'r' 和字符 'y'
代碼
class Solution {public int minimumOperations(String leaves) {int n=leaves.length();int[][] dp=new int[n][3];//int[n][3]代表3部分 紅 黃 紅 數組內數字代表需要的步數dp[0][0]=leaves.charAt(0)=='r'?0:1;dp[0][1]=dp[1][2]=dp[0][2]=Integer.MAX_VALUE;//不同顏色的葉子至少為一片for(int i=1;i<n;i++){int ir=leaves.charAt(i)=='r'?1:0;int iy=leaves.charAt(i)=='y'?1:0;dp[i][0]=dp[i-1][0]+iy;//由第一部分的轉移過來dp[i][1]= Math.min(dp[i-1][0],dp[i-1][1])+ir;//由第二部分或者第一部分轉移過來if(i>=2)dp[i][2]= Math.min(dp[i-1][1],dp[i-1][2])+iy;//由第二部分或者第三部分轉移過來}return dp[n-1][2];}
}