hihoCoder 1039: 字符消除

時間限制:1000mshtml

單點時限:1000msjava

內存限制:256MB算法

描述

小Hi最近在玩一個字符消除遊戲。給定一個只包含大寫字母"ABC"的字符串s,消除過程是以下進行的:測試

 

1)若是s包含長度超過1的由相同字母組成的子串,那麼這些子串會被同時消除,餘下的子串拼成新的字符串。例如"ABCCBCCCAA"中"CC","CCC"和"AA"會被同時消除,餘下"AB"和"B"拼成新的字符串"ABB"。ui

2)上述消除會反覆一輪一輪進行,直到新的字符串不包含相鄰的相同字符爲止。例如」ABCCBCCCAA」通過一輪消除獲得"ABB",再通過一輪消除獲得"A"spa

 

遊戲中的每一關小Hi都會面對一個字符串s。在消除開始前小Hi有機會在s中任意位置(第一個字符以前、最後一個字符以後以及相鄰兩個字符之間)插入任意一個字符('A','B'或者'C'),獲得字符串t。t通過一系列消除後,小Hi的得分是消除掉的字符的總數。.net

 

請幫助小Hi計算要如何插入字符,才能得到最高得分。code

 

輸入

輸入第一行是一個整數T(1<=T<=100),表明測試數據的數量。htm

以後T行每行一個由'A''B''C'組成的字符串s,長度不超過100。blog

 

輸出

對於每一行輸入的字符串,輸出小Hi最高能獲得的分數。

 

提示

第一組數據:在"ABCBCCCAA"的第2個字符後插入'C'獲得"ABCCBCCCAA",消除後獲得"A",總共消除9個字符(包括插入的'C')。

第二組數據:"AAA"插入'A'獲得"AAAA",消除後獲得"",總共消除4個字符。

第三組數據:不管是插入字符後獲得"AABC","ABBC"仍是"ABCC"都最多消除2個字符。

 

樣例輸入

3
ABCBCCCAA
AAA
ABC

樣例輸出

9
4
2

解題思路:

一、在給定字符串中的任意位置插入'A'、'B'、'C'中的任意一個字符,而後計算新字符串通過消除後最短的字符串長度;

二、在計算字符消除後最短長度時,只能一遍一遍地計算,我的沒有想出什麼更好的方法

三、記錄每次插入一個字符後通過第2步計算後最短的字符串長度min. 最後分值爲原字符串的長度 + 1 - min。

 

具體算法(java版,能夠被Accepted)

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {

		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		for (int i = 0; i < n; i++) {
			StringBuilder builder = new StringBuilder(scanner.next());
			int min = builder.length();
			for (int j = 0; j <= builder.length(); j++) {
				for (char ch = 'A'; ch <= 'C'; ch++) {
					StringBuilder temp = new StringBuilder(builder);
					temp = temp.insert(j, ch);
					int count = trim(temp.toString()).length();
					if (min > count) {
						min = count;
					}
				}

			}
			System.out.println(builder.length() + 1 - min);
		}
		scanner.close();

	}

	static String trim(String input) {
		String result = input.replaceAll("([A|B|C])\\1{1,}", "");
		if (result.equals(input)) {
			return result;
		} else {
			return trim(result);
		}
	}

}

參考出處:

http://www.cnblogs.com/pinxiong/p/4047331.html

http://blog.csdn.net/jmlikun/article/details/48471243

相關文章
相關標籤/搜索