本文主要是介绍LeetCode 838. 推多米诺,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
838. 推多米诺
题目描述提示帮助提交记录社区讨论阅读解答
随机一题
一行中有 N
张多米诺骨牌,我们将每张多米诺骨牌垂直竖立。
在开始时,我们同时把一些多米诺骨牌向左或向右推。
每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌。
同样地,倒向右边的多米诺骨牌也会推动竖立在其右侧的相邻多米诺骨牌。
如果同时有多米诺骨牌落在一张垂直竖立的多米诺骨牌的两边,由于受力平衡, 该骨牌仍然保持不变。
就这个问题而言,我们会认为正在下降的多米诺骨牌不会对其它正在下降或已经下降的多米诺骨牌施加额外的力。
给定表示初始状态的字符串 "S" 。如果第 i 张多米诺骨牌被推向左边,则 S[i] = 'L'
;如果第 i 张多米诺骨牌被推向右边,则 S[i] = 'R'
;如果第 i 张多米诺骨牌没有被推动,则 S[i] = '.'
。
返回表示最终状态的字符串。
示例 1:
输入:".L.R...LR..L.."
输出:"LL.RR.LLRRLL.."
示例 2:
输入:"RR.L"
输出:"RR.L"
说明:第一张多米诺骨牌没有给第二张施加额外的力。
提示:
0 <= N <= 10^5
- 表示多米诺骨牌状态的字符串只含有
'L'
,'R'
; 以及'.'
;
class Solution {
public:string pushDominoes(string dominoes) {int len = dominoes.length();vector<int>vis(len);string ans;ans = dominoes;for(int i = 0;i < len;i++)vis[i] = 0;for(int i = 0;i < len;i++){for(int j = 0;j < len;j++){if(ans[j] == 'R' && ans[j + 1] == '.' && j < len - 1)vis[j + 1] += 1;if(ans[j] == 'L' && ans[j - 1] == '.' && j >= 1)vis[j - 1] -= 1;}int flag = 0;for(int j = 0;j < len;j++){if(dominoes[j] == '.' && vis[j] != 0){if(vis[j] == 1)ans[j] = 'R';elseans[j] = 'L';flag = 1;}} for(int i = 0;i < len;i++)vis[i] = 0;if(flag == 0)break;}return ans;}
};
这题的解题思路是通过多次遍历字符串来实现的,每一次遍历到R时则让vis[i + 1] 加一,遍历到L时则把vis[i - 1]减一,当遍历完一次之后再通过对vis的值来判断这个点是否需要修改,当dominoes[i] == '.'时vis[i] 等于-1或者1时则需要将'.'相对应的改成'L'或者是'R',为了减少遍历次数,当发现此时vis不再发生改变时跳出循环,这题最关键的就是该点是否会从'.'变成'L'或者'R',因此每一次遍历只是修改相邻的点,这样就可以很简单的判断这个点是否会变。(vis是否为0)
这篇关于LeetCode 838. 推多米诺的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!