题目来源: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);
}