zoukankan      html  css  js  c++  java
  • 庞果网 字符串消除

     题目:

    给定一个字符串,仅由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;
    }

    欢迎指教。

  • 相关阅读:
    maven之私服搭建
    maven之自定义archetype
    maven之自定义插件
    任务调度之 Elastic Job
    雪花算法原理解析
    基于 zxing 的二维码生成、解析
    spring-cloud-oauth2 认证授权
    spring security 自定义短信验证登录
    spring security session管理
    JDK1.8之HashMap实现原理
  • 原文地址:https://www.cnblogs.com/eeason/p/3293311.html
Copyright © 2011-2022 走看看