leetcode中等838推多米诺

Posted qq_40707462

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode中等838推多米诺相关的知识,希望对你有一定的参考价值。



思路:双指针

  • 两个相邻的被推倒的牌互不影响。
  • 一张站立的牌(".")的最终状态与离其两侧最近的 “L” 或 “R” 有关。

可以使用「双指针」的方式寻找 "."左右两边距离最近的被推倒的牌,形成"X....Y"型的区间。

1'R......R' => 'RRRRRRRR'
2'L......L' => 'LLLLLLLL'
3'L......R' => 'L......R'
4'R......L' => 'RRRRLLLL' or 'RRRR.LLLL'(此时需判断中间‘.’的个数奇偶)
  1. l指向当前区间的开始( “L” 或者 “R”);
  2. r跳过所有的 “.”,指向当前区间的结束( “L” 或者 “R”)。
  3. 此时区间的形状为 “X…Y”,判断这个区间左右端点的 “X”、 "Y"是什么,确定中间的 "."的状态。
  4. 由于可能存dominoes最左边和最右边都是 ".",那么形成不了"X…Y" 这样的区间。所以,给dominoes最左边添加了一个 “L”,最右边添加了一个 “R”,这样不会影响dominoes内部所有的牌的倒向,但是有助于我们形成区间,而且这两个添加的牌,也不会放到最终结果里。
class Solution 
    public String pushDominoes(String dominoes) 
         dominoes = "L" + dominoes + "R";
        int l = 0;
        StringBuilder res = new StringBuilder();

        for(int r=l;r<dominoes.length();r++)
            if(dominoes.charAt(r)=='.') continue;//r 跳过‘.’,找到当前区间的最右
            if(l!=0) res.append(dominoes.charAt(l));//最左侧虚拟牌不加
            int mid=r-l-1;//中间有多少个‘.’,判断奇偶

            if(dominoes.charAt(l)==dominoes.charAt(r))//情况1、2、
                for(int i=0;i<mid;i++) res.append(dominoes.charAt(l));
            else if (dominoes.charAt(l) == 'L' && dominoes.charAt(r) == 'R') //情况3、
                for(int i=0;i<mid;i++) res.append('.');
            else//情况4、
                for(int i=0;i<mid/2;i++) res.append('R');
                if(mid%2==1) res.append('.');
                for(int i=0;i<mid/2;i++) res.append('L');
            
            l=r;
        
        return res.toString();
    

以上是关于leetcode中等838推多米诺的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 717. 1 比特与 2 比特字符 / 838. 推多米诺 / 1994. 好子集的数目(状态压缩动态规划)

838. 推多米诺(bfs&模拟)

LeetCode - 相同子树替换后最长重复子串多米诺骨牌

[leetcode] 推多米诺 双指针

[LeetCode] Push Dominoes 推多米诺骨牌

动态规划到底是什么鬼?dp数组到底是什么?