一行多米诺骨牌,给定每个牌往左倒或者往右倒,求最后每个骨牌的倒下方向。
思路:
注意到一个骨牌的最终方向取决于它左边和它右边骨牌的方向,具体而言,以下情况:
如果两边都是同一方向,那么中间的骨牌也会倒向这个方向
L...L: LLLLL
R...R: RRRRR
如果是在L和R之间,那么中间的骨牌不会受到外力,依然保持平航
L...R: 结果为L...R, 中间三个是平衡状态
最后一种情况,要考虑中间的骨牌数量是奇数还是偶数,奇数的时候中间的骨牌因为受力平衡,依然保持平衡状态
R...L:RR.LL
R....L: RRRLLL
public class Leetcode0838 {
public static void main(String[] args) {
System.out.println(new Leetcode0838().pushDominoes(".L.R...LR..L.."));
System.out.println(new Leetcode0838().pushDominoes("RR.L"));
}
public String pushDominoes(String dominoes) {
String s = "L" + dominoes + "R";
int len = s.length();
StringBuilder sb = new StringBuilder();
for (int i = 0, j = 1; j < len; j++) {
if (s.charAt(j) == '.') continue;
char c1 = s.charAt(i);
char c2 = s.charAt(j);
if (c1 == c2) {
for (int k = i; k < j; k++) sb.append(c1);
} else if (c1 == 'L' && c2 == 'R') {
sb.append(c1);
for (int k = i + 1; k < j; k++) sb.append('.');
} else {
//c1 == 'R' && c2 == 'L'
int mid = (i + j) / 2;
if (mid - i == j - mid) {
//中间有个平衡的
for (int k = i; k < mid; k++) sb.append(c1);
sb.append('.');
for (int k = mid + 1; k < j; k++) sb.append(c2);
} else {
for (int k = i; k <= mid; k++) sb.append(c1);
for (int k = mid + 1; k < j; k++) sb.append(c2);
}
}
i = j;
}
return sb.toString().substring(1);
}
}