Java實現 LeetCode 488 祖瑪遊戲

488. 祖瑪遊戲

回憶一下祖瑪遊戲。如今桌上有一串球,顏色有紅色®,黃色(Y),藍色(B),綠色(G),還有白色(W)。 如今你手裏也有幾個球。java

每一次,你能夠從手裏的球選一個,而後把這個球插入到一串球中的某個位置上(包括最左端,最右端)。接着,若是有出現三個或者三個以上顏色相同的球相連的話,就把它們移除掉。重複這一步驟直到桌上全部的球都被移除。ide

找到插入並能夠移除掉桌上全部球所需的最少的球數。若是不能移除桌上全部的球,輸出 -1 。spa

示例:
輸入: 「WRRBBW」, 「RB」
輸出: -1
解釋: WRRBBW -> WRR[R]BBW -> WBBW -> WBB[B]W -> WW (翻譯者標註:手上球已經用完,桌上還剩兩個球沒法消除,返回-1)翻譯

輸入: 「WWRRBBWW」, 「WRBRW」
輸出: 2
解釋: WWRRBBWW -> WWRR[R]BBWW -> WWBBWW -> WWBB[B]WW -> WWWW -> emptycode

輸入:「G」, 「GGGGG」
輸出: 2
解釋: G -> G[G] -> GG[G] -> empty遊戲

輸入: 「RBYYBBRRB」, 「YRBGB」
輸出: 3
解釋: RBYYBBRRB -> RBYY[Y]BBRRB -> RBBBRRB -> RRRB -> B -> B[B] -> BB[B] -> empty
標註:字符串

你能夠假設桌上一開始的球中,不會有三個及三個以上顏色相同且連着的球。
桌上的球不會超過20個,輸入的數據中表明這些球的字符串的名字是 「board」 。
你手中的球不會超過5個,輸入的數據中表明這些球的字符串的名字是 「hand」。
輸入的兩個字符串均爲非空字符串,且只包含字符 ‘R’,‘Y’,‘B’,‘G’,‘W’。get

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);
	    }
}
相關文章
相關標籤/搜索