题目
牛牛有一些排成一行的正方形。每个正方形已经被染成红色或者绿色。牛牛现在可 以选择任意一个正方形然后用这两种颜色的任意一种进行染色,这个正方形的颜色将 会被覆盖。牛牛的目标是在完成染色之后,每个红色R都比每个绿色G距离最左侧近。 牛牛想知道他最少需要涂染几个正方形。
输入描述:
一行字符串s,由R和G构成,表示正方形的颜色(R为红色,G为绿色)|s|
输出描述:
一个数最少需要涂染几个正方形
示例1
输入
RRGGG
输出
0
示例2
输入
RGGGR
输出
1
说明
修改最后一个
思路分析
- 这题意思是R全部在左边,G全部在右边
- 首先for一遍得到总的R,
- 遍历数组,看看分割线的左边有多少需要改的,分割线的右边有多少需要改的
- 左边需要改的是G,右边需要改的是R,
- 在遍历是顺便统计左边的R与G,又知道总的R,
- 所以左边需要改左G,右边需要改(总R-左R)
另一种思路是先遍历两次,求出left数组(当前索引左边的G有多少),与right数组(当前索引右边的R有多少),从而将r时间复杂度从O(N^2)降到O(N)
代码展示
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main{
public static void main(String[] args)throws IOException{
BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
String str = read.readLine();
int pos = 0;//移动指针
int recent_R = 0;//该指针处已经有多少R
int recent_G = 0;//该指针处有多少G
int R_num= 0;//R的总数量
for(int i=0;i<str.length();i++){//统计R的数量
if(str.charAt(i)=='R'){
R_num++;
}
}
int min = R_num;//最多需要该R次,(把R全部转为G)
for(int i=0;i<str.length();i++){
if(str.charAt(i)=='R'){
recent_R ++;
}else{
recent_G ++;
}
min = Math.min(min,recent_G+R_num-recent_R);
}
System.out.println(min);
}
}