力扣 838. 推多米诺

题目来源:https://leetcode-cn.com/problems/push-dominoes/

大致题意:
给一个字符串表示多米诺骨牌序列,其中 . 表示竖直的骨牌,L 表示向左边倒的骨牌,R 表示向右倒的骨牌。
如果一个骨牌倒向的方向的相邻骨牌是竖直的,那么也会被推倒为该方向。
如果一个竖直骨牌左右两侧相邻骨牌都导向它,那么其仍保持竖直状态。
求出最后的骨牌状态

思路

直接模拟骨牌推倒的过程

  • 可以看出来,要求的状态其实就是求字符 . 的位置最后的字符值

于是可以枚举所有的连续的竖直状态的骨牌,根据两侧的骨牌倒向决定状态

  • 如果左侧为 R,右侧为 L,表示向里面倒,一层一层更新状态即可
  • 如果左右两侧倒向相同,那么中间所有骨牌状态也和两侧相同
  • 如果左侧为 L,右侧为 R,那么不变

代码:

public String pushDominoes(String dominoes) {
        char[] s = dominoes.toCharArray();
        // 初始时默认为向左,即索引 -1 处骨牌倒向左,这样不会影响序列的骨牌状态
        char left = 'L';
        // 遍历索引
        int idx = 0;
        int n = s.length;
        while (idx < n) {
            // 定义临时索引,用来标记连续竖直状态的骨牌结束位置
            int i = idx;
            // 更新骨牌结束位置索引
            while (i < n && s[i] == '.') {
                i++;
            }
            // 如果骨牌结束位置索引未越界,那么右侧骨牌状态为实际值
            // 否则为默认值右,即索引 n 处骨牌倒向右,这样不会影响序列的骨牌状态
            char right = i < n ? s[i] : 'R';
            // 两侧状态相同,更新骨牌状态
            if (left == right) {
                while (idx < i) {
                    s[idx++] = left;
                }
            } else if (left == 'R' && right == 'L') {   // 两侧骨牌向内倒
                int end = i - 1;
                while (idx < end) {
                    s[idx++] = 'R';
                    s[end--] = 'L';
                }
            }
            // 更新左侧骨牌状态
            left = right;
            // 更新遍历索引
            idx = i + 1;
        }
        return new String(s);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三更鬼

谢谢老板!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值