推多米诺
题目描述
推多米诺
思路
遍历模拟
枚举所有连续的没有被推动的骨牌,根据这段骨牌的两边骨牌(如果存在的话)的推倒方向决定这段骨牌的最终状态:
- 如果两边的骨牌同向,则这段连续的竖立骨牌会倒向同一方向。
- 如果两边的骨牌相对,那么这段骨牌会向中间倒。
- 如果两边骨牌相反,则这段骨牌会保持竖立。
如果左侧没有被推倒的骨牌,则假设存在一块向左倒的骨牌;如果右侧没有被推倒的骨牌,则假设存在一块向右倒的骨牌。这样的假设不会破坏骨牌的最终状态,并且边界情况也可落入上述三种情况。
可以使用两个指针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);
}
}