所有红色都在绿色右边:需要改变颜色的个数

题目描述
有这样一个字符串,只有R和G组成
例:
RGRGGGR
要使得所有的R的位置,离最左侧的距离,都比所有的G要近。
可以修改颜色,如:把R改成G,G改成R

试问:最少需要修改的个数为多少?

思路:这题要使用累加法,举个例子

2 3 4 5 6.要算出这个数组0,n的数相加的总和。可以先用一个数组,保存0到n位子相加的总和。
比如res[0]=2,res[1]=2+3=5,res[2]=res[1]+4,res[3]=res[2]+5
如此,只要想计算0,n的总和,只要返回res[n]就行了。

RGRGGGR,只要计算从(0,n-1)G的个数和,从(n-1,0)R的个数和,G从左边开始,R从右边开始
左边要改的G和右边要改的R总数和最小即为所得

举个例子:
RGRGGGR
现在(0,2)有一个G,(n-1,2)有一个R。遇到这种情况,修改下标为1的的G为R,修改n-1下标的R为G就是要修改的最小值。当然你也可以把下标3的R改成G。这里我们只要求修改的最小个数就行了

#include<iostream>
using namespace std;
#include<algorithm>
int app(string str, int n);
int main()
{
	string str = "GRRRRG";
	int len = str.length();
	cout << app(str, len);	
	return 0;
}
	
int app(string str,int n)
{
	int G[100] = { 0 }, R[100] = {0};
	for (int i = 1; i <= n; i++)
		G[i] = G[i - 1] + (str[i - 1] == 'G');//G保存从左边开始G[N]的个数总和
	for (int i = n; i > 0; i--)
		R[i] = R[i + 1] + (str[i - 1] == 'R');
	int ans = n;

	//左边要改的G和右边要改的R总数和最小
	for (int i = 0; i <= n; i++)
		ans = min(ans, G[i] + R[i + 1]);
	return ans;
}

猜你喜欢

转载自blog.csdn.net/qq_40861091/article/details/100825489