题目:一个字符串仅有三种字符‘R','G','B',设计适当的算法,使得所有的’R'在'G'前,所有'G'在'B'前。
要求:时间复杂度O(n), 空间复杂度O(1), 且对字符串只能遍历一次。
算法思想:
假设数组刚开始全部是字符‘G',
对字符串遍历,如果字符为’R',即扔到数组前端; 如果字符为‘B',即扔到数组末端。
当遍历完,即可实现RGB有序。
算法伪码:
变量定义:对于字符串str,前端索引变量为ri=0,后端索引变量为gi=str.size();
对字符串遍历,对于索引位置i, 如果i < gi ,
begin
char c = str[i] ;
str[i] = 'G' ; //实现刚开始数组里面全是’G'的假设。
如果遇到字符c 等于’R‘,就把它丢到数组前端;
即 str[ri++] = 'R' ;
如果遇到字符c 等于’B‘,就把他丢到数组后端;
即 str[--gi] = 'B' ;
end
当遍历完字符串,RGB序列已有序化。
程序编码:
#include<iostream>
#include<string>
int main()
{
std::string str("RGBGGRGBBBRR") ;
int ri = 0, gi = str.size() ;
for(int i= 0; i<gi ; i++)
{
char c = str[i] ;
str[i] = 'G' ;
if( c == 'R')
str[ri++] = c ;
if( c == 'B')
str[--gi] = c ;
}
std::cout << str << std::endl ;
}