简化仅由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,因为min(i,j)=2,所以可以i=i-2,j=j-2,k=k+2如此下去,直到只有一个字母的个数大于等于1,输出这个字母的个数即可。

经过网友提醒,我发现这样的做法是有点问题的。需要考虑的特殊情况就是两个数是相等的,减完后全加到另一个数上了。
例如i=3,j=3,k=3.i==j,故i-3,j-3,k+3最后结果就是6了。
下面就要排除这个情况。
首先可以证明当i==j==k时,结果为2;
其次当i==j&&k==0时,结果为:若i为基数,则为1,偶数则为2.
其它情况就还是可以用一步到位的方法。
代码我已经改了。

代码如下:

int SimplifyStr(string str)
{
	int n=str.length();
	if (n<=0)return 0;
	int i=0,j=0,k=0;
	for (int t=0;t0&&j>0||i>0&&k>0||k>0&&j>0)  
    {  
        if (i==j&&j==k)return 2;
        if ((i==j&&k==0)||(k==j&&i==0)||(i==k&&j==0))
        {  
            int t=(i+j+k)/2;  
            if (t%2==0)
                return 2;
            else
                return 1;  
        }  
        if (k>0&&j>0&&k!=j)  
        {  
            int t=k>j?j:k;  
            k=k-t;  
            j=j-t;  
            i=i+t;  
        }  
        if (i>0&&k>0&&i!=k)  
        {  
            int t=i>k?k:i;  
            i=i-t;  
            k=k-t;  
            j=j+t;  
        }  
        if (i>0&&j>0&&i!=j)  
        {  
            int t=i>j?j:i;  
            i=i-t;  
            j=j-t;  
            k=k+t;  
        }  
    }
	if (i>0)return i;
	if (j>0)return j;
	if (k>0)return k;
}


你可能感兴趣的:(code-字符串)