n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立。在开始时,同时把一些多米诺骨牌向左或向右推。
每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌。同样地,倒向右边的多米诺骨牌也会推动竖立在其右侧的相邻多米诺骨牌。
如果一张垂直竖立的多米诺骨牌的两侧同时有多米诺骨牌倒下时,由于受力平衡, 该骨牌仍然保持不变。
就这个问题而言,我们会认为一张正在倒下的多米诺骨牌不会对其它正在倒下或已经倒下的多米诺骨牌施加额外的力。
给你一个字符串 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.."
提示:
n == dominoes.length
1 <= n <= 105
dominoes[i] 为 'L'、'R' 或 '.'
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/push-dominoes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路及方法
这道题读起来很复杂,但实际上我们发现,按照规则,我们会认为一张正在倒下的多米诺骨牌不会对其它正在倒下或已经倒下的多米诺骨牌施加额外的力。所以该怎么倒的牌不会发生变化,我们只需要考虑'.'两边的情况,判断其如何倒即可。
遍历数组,我们遇到'.'后,判断其左右两边的状态,如果'.'连续,就找到连续后右边的字符。说一下越界的情况,如果数组开头是'.',我们就设其左边是'L',这样不会对当前'.'施加力;同理,如果末尾是'.',我们就设其右边是'R'。判断:
- 当两边字符一致,'.'顺这字符一起倒;
- 当左边为'R',右边为'L',则向中间倒;
- 其余情况'.'均不倒。
class Solution {
public String pushDominoes(String dominoes) {
int n = dominoes.length();
char[] res = dominoes.toCharArray();
for (int i = 0; i < n; i++) {
// 只用修改‘.’
if (res[i] == '.') {
int idx = i;
// 左边字符
char left = i - 1 >= 0 ? res[i - 1] : 'L';
// 右边字符
while (idx + 1 < n && res[idx + 1] == '.') idx++;
char right = idx + 1 < n ? res[idx + 1] : 'R';
// 两边相等,朝一边倒向
if (left == right) {
while (i <= idx) res[i++] = right;
} else if (left == 'R' && right == 'L') {
// 两边方向相反,从两侧向中间倒
while (i < idx) {
res[i++] = 'R';
res[idx--] = 'L';
}
}
left = right;
}
}
return new String(res);
}
}
结果如下:
网友评论