推多米诺

这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战

leetcode 推多米诺

给你一个字符串 dominoes 表示这一行多米诺骨牌的初始状态,其中:

dominoes[i] = 'L',表示第 i 张多米诺骨牌被推向左侧, dominoes[i] = 'R',表示第 i 张多米诺骨牌被推向右侧, dominoes[i] = '.',表示没有推动第 i 张多米诺骨牌。 返回表示最终状态的字符串。

  示例 1:

输入:dominoes = "RR.L"
输出:"RR.L"
解释:第一张多米诺骨牌没有给第二张施加额外的力。
复制代码

示例 2:

输入:dominoes = ".L.R...LR..L.."
输出:"LL.RR.LLRRLL.."
复制代码

解题:dominoes字符串中的字符表示了多米诺骨牌的初始状态,有三种状态,第一种字符'L'代表这张多米诺骨牌是往左边倒下的;第二种字符'R'代表这张多米诺骨牌是往右边倒下的;第三种字符'.'代表这张多米诺骨牌是垂直竖立没有倒下的。那么根据规则,倒下的多米诺骨牌会推动其倒下方向相邻的多米诺骨牌,同时正在倒下的多米诺骨牌不会推动其他正在倒下或者已经倒下的多米诺骨牌。所以对于第一种状态'L'和第二种状态'R'的多米诺骨牌,其初始状态就是最终状态,即状态不会改变了,只有第三种状态'.'的多米诺骨牌的状态会有可能改变。那么对于第三种状态'.'的多米诺骨牌的最终状态是由其左右两边相邻的多米诺骨牌的最终状态来决定,对于边界位置的'.'由其存在多米诺骨牌的一边来决定,如果'.'两边的多米诺骨牌都是往同一方向倒下,那么'.'也是往这个方向倒下;如果'.'两边的多米诺骨牌是往相反方向倒下的,那么'.'保持不变;如果'.'两边的多米诺骨牌是往相对方向倒下的,那么'.'由于受力平衡还是保持不变。对此我们只需要找到所有'.'状态的多米诺骨牌判断其最终状态即可,如果'.'状态的多米诺骨牌是连续的那么可以一并处理。具体的,将dominoes字符串转为字符数组,然后遍历数组,获取'.'字符,如果是连续的那就继续获取,用两个指针left、right指向这段'.'的两端,判断left前一个和right后一个的方向,如果相同,那么这段'.'都应该倒向相同的方向,如果相反那么这段'.'不变,如果相对那么两个指针就相向移动,left经过的就往右倒,right经过的就往左倒,如果left和right中间只有一个那就保持不变。

class Solution {
    public String pushDominoes(String dominoes) {
        char[] chars = dominoes.toCharArray();
        int len = chars.length;
        for (int left = 0; left < len; left++) {
            if ('.' == chars[left]) {
                int right = left;
                while (right < len - 1 && (chars[right] == chars[right + 1])) {
                    right++;
                }
                char L = left == 0 ? 'L' : chars[left - 1];
                char R = right == len - 1 ? 'R' : chars[right + 1];
                if (L == R) {
                    while (left <= right) {
                        chars[left++] = L;
                    }
                }
                if (L == 'R' && R == 'L') {
                    int temp = right;
                    while (left < temp) {
                        chars[left++] = 'R';
                        chars[temp--] = 'L';
                    }
                }
                left = right;
            }

        }
        return new String(chars);
    }
}
复制代码

猜你喜欢

转载自juejin.im/post/7067176368458448927
今日推荐