题目不贴了,这个题目是我预面试时老师出的三道编程题之一。很遗憾,当时没接触过贪心算法。没有做出来。耿耿于怀啊,老师说这几道题目都很简单,现在看来确实是贪心中比较简单的了。回到题目本身,你会发现所有重复的字母,你只需考虑第一个字母,和最后一个不重复的字母,比如字符串是RRRGBRBG,重复的字母是R,与RRR挨着的是字符G,我们只需要将字符串RRR中第二个字符开始,都改成B,更复杂的也是如此。代码附上
int main()
{
char str[200005];
int n;
scanf("%d",&n);
scanf("%s", str);
int i, j, len, count;
count = 0;
len = n;
for (i = 0; i < len-1;)
{
if (str[i] != str[i + 1])
{
i++;
continue;
}
else
{
j = i + 1;
while (str[i] == str[j] && j < len)
j++;
if (j == len)
{
switch (str[i])
{
case'R':
for (i = i + 1; i < j; i = i + 2)
{
str[i] = 'G';
count++;
}
break;
case'G':
for (i = i + 1; i < j; i = i + 2)
{
str[i] = 'B';
count++;
}
break;
case'B':
for (i = i + 1; i < j; i = i + 2)
{
str[i] = 'R';
count++;
}
break;
}
}
else
{
switch (str[i])
{
case 'R':
if (str[j] == 'G')
{
for (i = i + 1; i < j; i = i + 2)
{
str[i] = 'B';
count++;
}
}
else if (str[j] == 'B')
{
for (i = i + 1; i < j; i = i + 2)
{
str[i] = 'G';
count++;
}
}
break;
case 'G':
if (str[j] == 'B')
{
for (i = i + 1; i < j; i = i + 2)
{
str[i] = 'R';
count++;
}
}
else if (str[j] == 'R')
{
for (i = i + 1; i < j; i = i + 2)
{
str[i] = 'B';
count++;
}
}
break;
case 'B':
if (str[j] == 'R')
{
for (i = i + 1; i < j; i = i + 2)
{
str[i] = 'G';
count++;
}
}
else if (str[j] == 'G')
{
for (i = i + 1; i < j; i = i + 2)
{
str[i] = 'R';
count++;
}
}
break;
}
i = j;
}
}
}
printf("%d\n", count);
printf("%s", str);
return 0;
}