RGB排序,一个字符串,里面只有三种字符R G B,所有的R都在G的前面,
所有的G都在B的前面。将给定字符串按照此规律排序。
要求不允许用辅助空间,
复杂度控制在O(N)。
(该题O(2N)的情况话,直接统计RGB俩个出现的个数,在统一赋值!感觉此种方法也合适!) 不允许使用额外辅助空间,能用下标,或指针吗?疑惑
如下解法用到了俩对下标,也不知道是否是辅助空间,囧!
解题思路:
类似快排中的区间划分,将R放在左边,B放在右边。
的注意特殊情况,全是R,或全是B,全是G.
另一位仁兄的思路:http://blog.csdn.net/smilestone_322/article/details/8038675
#include <iostream>
#include <cstdlib>
using namespace std;
void rgb_sort(char *array,unsigned int n);
int main()
{ //RRRRRGGGGGBBBB
char a[] = "BRGGGRRBBGRBRG";
//RRRRRGGGGGGGBBBBB
char b[] = "GBRRRGBBGBRRBGGGG";
//RRRRRRRRGGGGGBBBBBB
char c[] = "BBRRRGBBGBRRBGGGRRR";
//GGGGGGGGGGGGGGGGGG
char d[] = "GGGGGGGGGGGGGGGGGG";
//RRRRRRRRRRRRRRRRR
char e[] = "RRRRRRRRRRRRRRRRR";
//BBBBBBBBBBBBBBBBB
char f[] = "BBBBBBBBBBBBBBBBB";
//RRRRRRRRRGGGBBBBBBBBB
char g[] = "BBRRRBBBRBBGRGGBRBRRR";
rgb_sort(a,strlen(a));
cout<<"1:"<<a<<endl;
rgb_sort(b,strlen(b));
cout<<"2:"<<b<<endl;
rgb_sort(c,strlen(c));
cout<<"3:"<<c<<endl;
rgb_sort(d,strlen(d));
cout<<"4:"<<d<<endl;
rgb_sort(e,strlen(e));
cout<<"5:"<<e<<endl;
rgb_sort(f,strlen(f));
cout<<"6:"<<f<<endl;
rgb_sort(g,strlen(g));
cout<<"7:"<<g<<endl;
return 0;
}
void rgb_sort(char *array,unsigned int n)
{
int cur_left,cur_right;
int index_i,index_j;
cur_left = index_i = 0;
cur_right = index_j = n-1;
while(cur_left <= cur_right)//条件<=
{
while(cur_left <= cur_right && array[cur_left] == 'R')
{
cur_left++;
array[index_i] = 'R';
index_i ++ ;
}
while(cur_left <= cur_right && array[cur_right] == 'B')
{
cur_right--;
array[index_j] = 'B';
index_j--;
}
//以上考虑了相等指向同一个元素情况!
if(cur_left > cur_right )break;
/* 不能用额外的空间
char temp_left = array[cur_left] ;
char temp_right = array[cur_right];//防止下面覆盖修改!
if(temp_left == 'B')
{
array[index_j] = 'B';
index_j--;
}
if(temp_right == 'R')
{
array[index_i] = 'R';
index_i ++ ;
}
*/
if(array[cur_left] == 'B'&&array[cur_right] == 'R')
{
array[index_j] = 'B';
index_j--;
array[index_i] = 'R';
index_i ++ ;
}
else if(array[cur_left] == 'B')//BG
{
array[index_j] = 'B';
index_j--;
}
else if(array[cur_right] == 'R')//RG
{
array[index_i] = 'R';
index_i ++ ;
}
cur_left++;
cur_right--;
}
while(index_i <= index_j)
{
array[index_i] = 'G';
index_i++;
}
}