題目如下:
解題思路:本題題目中有一點要求很關鍵,“we will consider that a falling domino expends no additional force to a falling or already fallen domino.”,正好對應題目中的例子2,要好好理解一下。因為輸入的最大dominoes是10^5,所以要考慮性能問題。dominoes有三種狀態:'R','L','.'。在最終狀態里面,R和L是不會變的,只有'.'的狀態可能會變成三種狀態的任意一種。我的思路是把所有連續的'.'當做一個子序列,然后判斷這個子序列左邊和右邊的dominoes是R還是L,這里分這么幾種情況:
a.左右的dominoes方向相同,那么子序列所有的'.'的方向和左右方向相同;
b.左邊的dominoes向右,右邊的dominoes向左,如下圖,那么要考慮子序列長度是奇偶性來決定最中間的'.'的取值。如下圖,
c.子序列出現要頭尾要單獨考慮;
d.左邊的dominoes向左,右邊的dominoes向右,那么子序列所有的'.'的方向保持不變,還是為'.';
最后,出現一個很奇怪的問題,按照我的思路寫出的python代碼會TEL,但是js代碼確能AC,不知道是什么原因。
代碼如下:
Python ->
class Solution(object): def pushDominoes(self, dominoes): """ :type dominoes: str :rtype: str """ dl = '#' + dominoes + '#' start = end = None res = '' for i in xrange(len(dl)): if dl[i] != '.': #first opmitize if start != None: end = i - 1 else: if dl[i] != '#': res += dl[i] if start != None and end != None: if dl[start-1] == dl[end+1] and dl[start-1] != '#': res += (end-start+1)*dl[start-1] elif dl[start-1] == 'R' and dl[end+1] == 'L': if (end - start) % 2 != 0: mid = (end - start + 1) / 2 res += 'R'*mid res += 'L'*mid else: mid = (end - start + 1) / 2 res += 'R' * mid res += '.' res += 'L' * mid elif dl[start-1] == '#' and dl[end+1] == 'L': res += 'L'*(end-start+1) elif dl[end+1] == '#' and dl[start-1] == 'R': res += 'R' * (end - start + 1) else: res += '.' * (end - start + 1) if dl[i] != '#': res += dl[i] start = end = None else: if start == None: start = i return res
js ->
var pushDominoes = function(dominoes) { var dl = '#' + dominoes + '#' var start = end = undefined var res = '' for(var i = 0;i < dl.length;i++){ if(dl[i] != '.'){ if (start != undefined){ end = i - 1 } else{ if (dl[i] != '#'){ res += dl[i] } } if (start != undefined && end != undefined){ if (dl[start-1] == dl[end+1] && dl[start-1] != '#'){ //res += (end-start+1)*dl[start-1] res += dl[start-1].repeat(end-start+1) } else if (dl[start-1] == 'R' && dl[end+1] == 'L'){ if ((end - start) % 2 != 0){ mid = (end - start + 1) / 2 //res += 'R'*mid //res += 'L'*mid res += 'R'.repeat(mid) res += 'L'.repeat(mid) } else{ mid = (end - start + 1) / 2 //res += 'R' * mid //res += 'L' * mid res += 'R'.repeat(mid) res += '.' res += 'L'.repeat(mid) } } else if(dl[start-1] == '#' && dl[end+1] == 'L'){ //res += 'L'*(end-start+1) res += 'L'.repeat(end-start+1) } else if(dl[end+1] == '#' && dl[start-1] == 'R'){ //res += 'R' * (end - start + 1) res += 'R'.repeat(end-start+1) } else{ //res += '.' * (end - start + 1) res += '.'.repeat(end-start+1) } if (dl[i] != '#'){ res += dl[i] } start = end = undefined } } else{ if (start == undefined){ start = i } } } return res };