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

2014-11-24 09:44:04 · 作者: · 浏览: 0
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); } }