838. Push Dominoes

Link

Solution

這題的concept是找到以下4種我們可以處理的區間

L.........L => LLLLLLL R.........R => RRRRRR L.........R => L..........R R.........L => RRRLLL or RRR.LLLL 所以使用two pointer的技巧去找出符合的interval,然後因為頭尾可能是'.',頭尾加上R + oldString + L,讓它好處理... 這蠻tricky的。 注意: 每次加入的是interval中間的值,不包含頭尾i , j 的值,只有在i != 0 時更新 i,而且最後不更新尾。

public void append(StringBuilder sb, char c, int times){
            int n = 0;
            while(n < times){
                sb.append(c);
                n++;
            }
    }
    
    public String pushDominoes(String dominoes) {
        dominoes = "L" + dominoes + "R";
        StringBuilder sb = new StringBuilder();
        
        for(int i = 0, j = 1; j < dominoes.length(); j++){
            if(dominoes.charAt(j) == '.'){
                continue;
            }
            if(i != 0){
                sb.append(dominoes.charAt(i));
            }
            int middleCount = j - i -1;
            if(dominoes.charAt(i) == dominoes.charAt(j)){
                append(sb, dominoes.charAt(i), middleCount);
            }
            else if (dominoes.charAt(i) == 'L' && dominoes.charAt(j) == 'R'){
                append(sb, '.', middleCount);
            }
            else{
                append(sb, 'R', middleCount/2);
                if(middleCount % 2 != 0){
                    sb.append('.');
                }
                append(sb, 'L', middleCount/2);
            }
            i = j;
        }
        return sb.toString();
    }

Last updated

Was this helpful?