Java aplicación LeetCode 488 Zuma Juego

488. Zuma Juego

Recordemos Zuma juego. Ahora un balón tabla de cadenas ® de color rojo, amarillo (Y), azul (B), verde (G), así como el blanco (W). Ahora usted tiene las manos de unas cuantas bolas.

Cada vez, se puede elegir entre las manos de una pelota, entonces la bola se inserta en un montón de bolas en una determinada posición (incluyendo la extrema izquierda, la extrema derecha). Entonces, si no se produce el mismo tres o más de tres colores globo unido a continuación, poner a eliminarlos. Repita este paso hasta que todas las bolas en la tabla se eliminan.

Descubre el inserto se puede quitar y el número mínimo de bolas necesitaba todas las bolas en la tabla. Si no puede eliminar todas las bolas en la tabla, la salida de -1.

Ejemplo:
Entrada: "WRRBBW", "RB"
de salida: -1
explicó: WRRBBW -> WRR [R] BBW -> WBBW -> WBB [B] W -> WW ( traductor denotado: balón con la mano se ha utilizado hasta, dos bolas que quedan sobre la mesa no pueden ser eliminados, -1)

De entrada: "WWRRBBWW", "WRBRW"
de salida: 2
explica: WWRRBBWW -> WWRR [R] BBWW -> WWBBWW -> WWBB [B] WW -> WWWW -> vacío

De entrada: "G", "GGGGG"
de salida: 2
explica: G -> G [G] -> GG [G] -> vacío

Entrada: "RBYYBBRRB", "YRBGB"
de salida: 3
explica: RBYYBBRRB -> RBYY [Y] BBRRB -> RBBBRRB -> RRRB -> B -> B [B] -> BB [B] -> vacío
etiqueta:

Usted puede asumir que en el inicio de la bola en la mesa, habrá tres y tres o más mismo color y la bola adjunto.
pelota de ping no más de 20, el nombre de una cadena de entrada de datos en nombre de estas bolas son "tablero".
Pelota en sus manos no será superior al 5, los datos de entrada que representan los nombres de estas bolas de cadena es "mano".
Dos cadenas de entrada son cadena no vacía, y sólo caracteres comprende 'R' 'Y', 'B', 'G', 'W'.

class Solution {
 int DFS(String board,Map<Character,Integer> num){
	        if(board.length()==0) return 0;
	        int ans = 0x3f3f3f3f,l = board.length(),need,i,j;
	        for(i = 0;i < l;i = j){
	            j = i + 1;
	            while(j < l && board.charAt(j) == board.charAt(i)) j++;
	            need = 3 - (j - i);//当前位置要满足三个球消除需要几个额外的。
	            if(need <= num.get(board.charAt(i))){
	                need = Math.max(0,need);//可能存在有连续消除的情况。此时need为负数。例如WWWW
	                 num.put(board.charAt(i),num.get(board.charAt(i))-need);
	                
	                String subStr = board.substring(0,i) + board.substring(j);
	                int cnt = DFS(subStr,num);
	                if(cnt >= 0)
	                    ans = Math.min(ans , need + cnt);
	                num.put(board.charAt(i), num.get(board.charAt(i))+need);
	               
	            }
	        }
	        if(ans == 0x3f3f3f3f) return -1;
	        else return ans;    
	    }
	    int findMinStep(String board, String hand) {
	        Map <Character,Integer> num = new HashMap<Character,Integer>();//这里要定义char
	        num.put('R', 0);
	        num.put('Y', 0);
	        num.put('B', 0);
	        num.put('G', 0);
	        num.put('W', 0);
	        
	        int l = hand.length();
	        for(int i = 0;i < l;i++){
	            num.put(hand.charAt(i), num.get(hand.charAt(i))+1);
	        }
	        return DFS(board,num);
	    }
}
Liberadas 1587 artículos originales · ganado elogios 20000 + · vistas 2,43 millones +

Supongo que te gusta

Origin blog.csdn.net/a1439775520/article/details/104999585
Recomendado
Clasificación