【預處理數(shù)組-RRRGGG】
有一些排成一行的正方形,每個正方形已經(jīng)被染成紅色或者綠色,現(xiàn)在可以選擇任意一個正方形然后用這兩種顏色的任意一種進染色。這個正方形的顏色將會被覆蓋,目標是在完成染色之后,每個紅色R都比每個綠色G距離最左側(cè)近。返回最少需要涂染幾個正方形。
如樣例所示,s = RGRGR, 涂染之后變成RRRGG滿足要求了。涂染的個數(shù)為2. 沒有比這更好的涂染方案了。
解答:
這道題的意思就是最少涂染幾個,可以讓左邊的都是R,右邊的都是G。可以這么想,分別從0開始遍歷,以第i個為分割點,則右邊有幾個R,左邊有幾個G需要涂染滿足條件。則兩個加起來最小的值就是答案。所以可以預處理為2個一維數(shù)組,R[], G[], R[] 表示每個位置右邊總共有幾個R,G[] 表示每個位置左邊總共有幾個G。
public class ColorDraw {
public static int colorDraw(String s) {
if (s == null || s.length < 1) {
return 0;
}
char[] str = s.toCharArray();
int N = str.length;
int[] right = new int[N];
right[N - 1] = str[N - 1] == 'R' ? 1 : 0;
for (int i = N - 2; i >= 0; i--) {
right[i] = str[i+1] + (str[i] == 'R' ? 1: 0);
}
int ans = right[0];
int left = 0;
for (int i = 0; i < N - 1; i++) {
left += str[i] == 'G' ? 1:0;
ans = Math.min(ans, left + right[i+1]);
}
ans = Math.min(ans, left + (str[N - 1] == 'G‘ ? 1:0));
return ans;
}
}