简单化仅由a,b,c 3种小写字母组成的字符串

简化仅由a,b,c 3种小写字母组成的字符串

题目详情:给定一个字符串,仅由a,b,c 3种小写字母组成。 

当出现连续两个不同的字母时,你可以用另外一个字母替换它,如   有ab或ba连续出现,你把它们替换为字母c; 

有ac或ca连续出现时,你可以把它们替换为字母b; 

有bc或cb 连续出现时,你可以把它们替换为字母a。 

你可以不断反复按照这个规则进行替换,你的目标是使得最终结果所得到的字符串尽可能短,  求最终结果的最短长度。  

输入:字符串。长度不超过200,仅由abc三种小写字母组成。  

输出: 按照上述规则不断消除替换,所得到的字符串最短的长度。  

例如:输入cab,输出2。因为我们可以把它变为bb或者变为cc。   输入bcab,输出1。尽管我们可以把它变为aab -> ac -> b,也可以把它变为bbb, 但因为前者长度更短,所以输出1


经过一番思考,我想出了一个比较有效的算法,现跟大家分享。

用 i,j,k分别记录下a,b,c字母的个数,当有两个字母的数目大于等于1,例如i=2,j=3,k=0,则i=i-1,j=j-1,k=k+1如此下去,直到只有一个字母的个数大于等于1,输出这个字母的个数即可。


代码如下:

int SimplifyStr(string str)
{
	int n=str.length();
	if (n<=0)return 0;
	int i=0,j=0,k=0;
	for (int t=0;t<n;t++)
	{
		if (str[t]=='a')i++;
		if (str[t]=='b')j++;
		if (str[t]=='c')k++;
	}
	while (i>0&&j>0||i>0&&k>0||k>0&&j>0)
	{
		if (i>0&&j>0)
		{
			int t=i>j?j:i;
			i=i-t;
			j=j-t;
			k=k+t;
		}
		if (k>0&&j>0)
		{
			int t=k>j?j:k;
			k=k-t;
			j=j-t;
			i=i+t;
		}
		if (i>0&&k>0)
		{
			int t=i>k?k:i;
			i=i-t;
			k=k-t;
			j=j+t;
		}
	}
	if (i>0)return i;
	if (j>0)return j;
	if (k>0)return k;
}