简单化仅由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; }