0
点赞
收藏
分享

微信扫一扫

力扣每日一题2022-02-21中等题:推多米诺

微言记 2022-02-21 阅读 40
leetcode

推多米诺


题目描述

推多米诺


思路

遍历模拟

枚举所有连续的没有被推动的骨牌,根据这段骨牌的两边骨牌(如果存在的话)的推倒方向决定这段骨牌的最终状态:

  • 如果两边的骨牌同向,则这段连续的竖立骨牌会倒向同一方向。
  • 如果两边的骨牌相对,那么这段骨牌会向中间倒。
  • 如果两边骨牌相反,则这段骨牌会保持竖立。
    如果左侧没有被推倒的骨牌,则假设存在一块向左倒的骨牌;如果右侧没有被推倒的骨牌,则假设存在一块向右倒的骨牌。这样的假设不会破坏骨牌的最终状态,并且边界情况也可落入上述三种情况。
    可以使用两个指针i和j遍历所有连续的没有被推动的骨牌,left和right表示两边骨牌的推倒方向,根据上述三种情况来计算骨牌的最终状态。

Python实现

class Solution:
    def pushDominoes(self, dominoes: str) -> str:
        s = list(dominoes)
        n, i, left = len(s), 0, 'L'
        while i < n:
            j = i
            while j < n and s[j] == '.':
                j += 1
            right = s[j] if j < n else 'R'
            if left == right:
                while i < j:
                    s[i] = right
                    i += 1
            elif left == 'R' and right == 'L':
                k = j - 1
                while i < k:
                    s[i] = 'R'
                    s[k] = 'L'
                    i += 1
                    k -= 1
            left = right
            i = j + 1
        return ''.join(s)

Java实现

class Solution {
    public String pushDominoes(String dominoes) {
        char[] s = dominoes.toCharArray();
        int n = s.length, i = 0;
        char left = 'L';
        while (i < n) {
            int j = i;
            while (j < n && s[j] == '.') { // 找到一段连续的没有被推动的骨牌
                j++;
            }
            char right = j < n ? s[j] : 'R';
            if (left == right) { // 方向相同,那么这些竖立骨牌也会倒向同一方向
                while (i < j) {
                    s[i++] = right;
                }
            } else if (left == 'R' && right == 'L') { // 方向相对,那么就从两侧向中间倒
                int k = j - 1;
                while (i < k) {
                    s[i++] = 'R';
                    s[k--] = 'L';
                }
            }
            left = right;
            i = j + 1;
        }
        return new String(s);
    }
}
举报

相关推荐

0 条评论