庞果网 字符串消除
题目:
给定一个字符串,仅由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。 函数头部: C/C++ int minLength(const char *s);
Java: public class Main { public static int minLength(String s);
void f(int* a,int i,int number)//去掉字符
{
while(i<number)
{
a[i]=a[i+1];i++;
}
}
int Getx(int a[],int number)//获得消除字符后字符的长度
{
int i;bool flag=true;
while(flag)//消除字符开始
{
for(i=1;i<number;i++)
{
if(a[i]!=a[i-1])
{
switch(a[i]*a[i-1])//判断缺少那个字符,也就是消除字符的规则
{
case 2:
a[i-1]=3;
f(a,i,number);
number-=1;
break;
case 3:
a[i-1]=2;
f(a,i,number);
number-=1;
break;
case 6:
a[i-1]=1;
f (a,i,number);
number-=1;
break;
}
}
}
flag=false;
for(i=1;i<number;i++)//判断是否还有别的字符
{
if(a[i]!=a[i-1])
{
flag=true;
break;
}
}
}
return number;//返回长度
}
int minLength(const char *s)
{
int i=0,j=0,number=0,x1=0,x2=0;
for(i=0;s[i];i++);//获得字符串的长度(其实可以不用的,不过自己比较懒也就懒得改了)
number=i;
int* a=new int[number];
int* b=new int[number];
for(i=0;s[i];i++)//在a,b,c换为数字
{
switch(s[i])
{
case 'a':
b[j]=a[j]=1;
j++;
break;
case 'b':
b[j]=a[j]=2;
j++;
break;
case 'c':
b[j]=a[j]=3;
j++;
break;
}
}
sort(a,a+number);//对a排序,b不排
x1=Getx(a,number);
x2=Getx(b,number);
if(x1>=x2)return x2;
else return x1;
}
欢迎指教。