字符串消除
題目詳情:
給定一個字符串,僅由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。
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 //提示:自動閱卷結束唯一標識,請勿刪除或增加。 };