给定一个字符串,仅由a,b,c 3种小写字母组成。

package com.boco.study;
/**
 * 题目详情
给定一个字符串,仅由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。
 *运行结果大于3秒,悲剧! 
 */
public class Main {
	      public static int minLength(String s){
	    	 s = Main.shortString(s);
	    	 System.out.println("返回的结果是:"+s);
	    	 int length=s.length();
	    	 System.out.println("返回的大小是:"+length);
	    	  return length;
	      }
	      
	      public  static String shortString(String s){
	    	  System.out.println(s);
	    		String result="";
	    		int length=s.length();
		    	//String  header="";
		    	//如果最后剩下两个字符。
		    	  if(length==2)
		    	  {
		    		  //两个字符相同,无法再进行替换。
		    		  if(s.charAt(0)==s.charAt(1))
		    		  {
		    			  return s;
		    		  }else{
		    			  if(s.charAt(0)=='a'&&s.charAt(1)=='b')
		    			  {
		    				  return "c";
		    			  }else if(s.charAt(0)=='a'&&s.charAt(1)=='c'){
		    				  return "b";
		    			  }else if(s.charAt(0)=='b'&&s.charAt(1)=='a'){
		    				  return "c";
		    			  }else if(s.charAt(0)=='b'&&s.charAt(1)=='c'){
		    				  return "a";
		    			  }else if(s.charAt(0)=='c'&&s.charAt(1)=='a'){
		    				  return "b";
		    			  }else if(s.charAt(0)=='c'&&s.charAt(1)=='b'){
		    				  return "a";
		    			  }
		    		  }
		    		  
		    	  }else if(length==1)
		    	  {
		    		  return s;
		    	  }else if(length>=3){
		    		  if(s.charAt(0)==s.charAt(1))
		    		  {
		    			 // header = s.charAt(0)+"";
		    			  s=s.charAt(0)+Main.shortString(s.substring(1));
		    			  if(s.charAt(0)==s.charAt(1)){
		    				  return s;
		    			  }else{
		    				  return Main.shortString(s); 
		    			  } 
		    		  }else{
		    			  if(s.charAt(0)=='a'&&s.charAt(1)=='b')
		    			  {
		    				  return Main.shortString("c"+s.substring(2));
		    			  }else if(s.charAt(0)=='a'&&s.charAt(1)=='c'){
		    				  return Main.shortString("b"+s.substring(2));
		    			  }else if(s.charAt(0)=='b'&&s.charAt(1)=='a'){
		    				  return  Main.shortString("c"+s.substring(2));
		    			  }else if(s.charAt(0)=='b'&&s.charAt(1)=='c'){
		    				  return  Main.shortString("a"+s.substring(2));
		    			  }else if(s.charAt(0)=='c'&&s.charAt(1)=='a'){
		    				  return Main.shortString("b"+s.substring(2));
		    			  }else if(s.charAt(0)=='c'&&s.charAt(1)=='b'){
		    				  return Main.shortString("a"+s.substring(2));
		    			  }
		    		  }
		    	  }
	    		return result;
	    	}
	      /**
	       * 参数:
	       * 1.操作的字符串。
	       * 函数内的变量:
	       * 1.当前滞留的字符串。(准确的说是新产生的字符串)。
	       * 2.当前操作的字符串的长度。
	       * 操作方法:
	       * 1.先比较下一个字符,如果不同,按照替换规则替换成新的字符串。接着执行替换函数。
	       * 2.如果相同。保留当前位置以前的字符串,将剩下的字符串继续执行替换函数。
	       * 3.将滞留的字符串的最后一个字符和返回的字符串进行相加,接着执行替换函数
	       * 循环结束的条件:
	       * 1.执行替换函数后返回的结果为1.
	       * 2.执行替换函数后返回的结果是2,但是两个字符相等。
	       * 返回的结果:
	       * 
	       */
	      public static void main(String[] args) {
			String string="";
			for(int i=0;i<200;i++)
			{
				if(i%3==0)
				{
					string+="a";
				}else if(i%3==1){
					string+="b";
				}else if(i%3==2){
					string+="c";
				}
			}
			Main.minLength(string);
		}
}



原文地址:https://www.cnblogs.com/suncoolcat/p/3292147.html