字符串消除

题目详情:

给定一个字符串,仅由a,b,c 3种小写字母组成。当出现连续两个不同的字母时,你可以用另外一个字母替换它,如


  1. 有ab或ba连续出现,你把它们替换为字母c;

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

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


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


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

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


例如:输入cab,输出2。因为我们可以把它变为bb或者变为cc。

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



public class Main {
  public static int minLength(String s) {
          
        char[] baseArray = {'a', 'b', 'c'};
        char first;
        char second;
          
        while(true) {
            boolean haveDifferent = false;
            for(int i = 0; i < s.length() - 1; i++) {
                first = s.charAt(i);
                second = s.charAt(i+1);
                if(first != second) {
                    haveDifferent = true;
                    String oldStr = first + "" + second;
                    String newStr = "";
                    for(int j = 0; j < baseArray.length;j++) {
                          if(baseArray[j] != first && baseArray[j] != second) {
                              newStr = baseArray[j] + "";
                              break;
                          }
                      }
                    s = s.replace(oldStr, newStr);
                    break;
                }
            }
              
            if(!haveDifferent) {
                break;
            }
        }
          
        char third;
        while(true) {
            boolean haveSame = false;
            for(int i = 0; i < s.length() - 2; i++) {
                first = s.charAt(i);
                second = s.charAt(i+1);
                third = s.charAt(i+2);
                if(first == second && second == third) {
                    haveSame = true;
                    String oldStr = first + "" + second + "" + third;
                    String newStr = first + "";
                    s = s.replace(oldStr, newStr);
                    break;
                }
            }
              
            if(!haveSame) {
                break;
            }
        }
        return s.length();
  }
    
   
  //start 提示:自动阅卷起始唯一标识,请勿删除或增加。
    public static void main(String args[])
    {
        String s = "cab";
        System.out.println("String " +s + " , length : " + minLength(s));
        s = "bcab";
        System.out.println("String " +s + " , length : " + minLength(s));
        s = "cabb";
        System.out.println("String " +s + " , length : " + minLength(s));
         s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
        System.out.println("String " +s + " , length : " + minLength(s));
    }
    //end //提示:自动阅卷结束唯一标识,请勿删除或增加。
};