题目链接:http://blog.csdn.net/jirongzi_cs2011/article/details/11728065#cpp
题目:给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后。 要求:空间复杂度是O(1),且只能遍历一次字符串。
题解: 对于一个合法字符串(即R在前 G中 B在后),如RRGGBB
在这个字符串后面再加个R,变成 RRGGBBR,如要把它变成合法字符串,先跟 第一个出现的G 交换
字符串变成 RRRGBBG ,再把 末尾的G 跟 第一个出现的B 交换
字符串变成 RRRGGBB。
如果是 在这个字符串后面 加一个 G ,RRGGBBG,则只需要把 G 与 第一个出现的 B 交换
字符串变成 RRGGGBB
如果是 在这个字符串后面 加一个B,则无需操作。
void swap(char *a, char *b) {
char t = *a;
*a = *b;
*b = t;
}
char* strRGB(char *str) {
int i, sG = -1, sB = -1;
for (i = 0; str[i]; i++) {
if (str[i] == 'R') {
if (sG != -1) {
swap(&str[sG], &str[i]);
sG++;
}
if (sB != -1) {
swap(&str[sB], &str[i]);
sB++;
}
} else if (str[i] == 'G') {
if (sB != -1) {
swap(&str[sB], &str[i]);
sB++;
if (sG == -1){
sG = sB - 1;
}
} else if (sG == -1){
sG = i;
}
} else if (sB == -1){
sB = i;
}
}
return str;
}