leetcode中等838推多米诺
Posted qq_40707462
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode中等838推多米诺相关的知识,希望对你有一定的参考价值。
思路:双指针
- 两个相邻的被推倒的牌互不影响。
- 一张站立的牌(".")的最终状态与离其两侧最近的 “L” 或 “R” 有关。
可以使用「双指针」的方式寻找 "."
左右两边距离最近的被推倒的牌,形成"X....Y"
型的区间。
1、'R......R' => 'RRRRRRRR'
2、'L......L' => 'LLLLLLLL'
3、'L......R' => 'L......R'
4、'R......L' => 'RRRRLLLL' or 'RRRR.LLLL'(此时需判断中间‘.’的个数奇偶)
l
指向当前区间的开始( “L” 或者 “R”);r
跳过所有的 “.”,指向当前区间的结束( “L” 或者 “R”)。- 此时区间的形状为 “X…Y”,判断这个区间左右端点的 “X”、 "Y"是什么,确定中间的 "."的状态。
- 由于可能存dominoes最左边和最右边都是
"."
,那么形成不了"X…Y" 这样的区间。所以,给dominoes最左边添加了一个 “L”,最右边添加了一个 “R”,这样不会影响dominoes内部所有的牌的倒向,但是有助于我们形成区间,而且这两个添加的牌,也不会放到最终结果里。
class Solution
public String pushDominoes(String dominoes)
dominoes = "L" + dominoes + "R";
int l = 0;
StringBuilder res = new StringBuilder();
for(int r=l;r<dominoes.length();r++)
if(dominoes.charAt(r)=='.') continue;//r 跳过‘.’,找到当前区间的最右
if(l!=0) res.append(dominoes.charAt(l));//最左侧虚拟牌不加
int mid=r-l-1;//中间有多少个‘.’,判断奇偶
if(dominoes.charAt(l)==dominoes.charAt(r))//情况1、2、
for(int i=0;i<mid;i++) res.append(dominoes.charAt(l));
else if (dominoes.charAt(l) == 'L' && dominoes.charAt(r) == 'R') //情况3、
for(int i=0;i<mid;i++) res.append('.');
else//情况4、
for(int i=0;i<mid/2;i++) res.append('R');
if(mid%2==1) res.append('.');
for(int i=0;i<mid/2;i++) res.append('L');
l=r;
return res.toString();
以上是关于leetcode中等838推多米诺的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 717. 1 比特与 2 比特字符 / 838. 推多米诺 / 1994. 好子集的数目(状态压缩动态规划)