1. 程式人生 > >leetCode---838. 推多米諾

leetCode---838. 推多米諾

838. 推多米諾    https://leetcode-cn.com/problems/push-dominoes/

一行中有 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'; 以及 '.';

思路:根據題意,找到那些可以倒,一步一步倒塌,如果輸出,就是其倒塌過程。兩邊加上“..”,便於處理.

但是對於情況“"R.R.L"”應該為“RRR.L”需要注意。

另外,不能使用一個字串,需要d1,d2,否則 “R..L” 處理就錯誤了。

class Solution {
	public:
		string pushDominoes(string dominoes) {

			int n=dominoes.size();
			string d1=".."+dominoes+"..",temp;
			string d2=d1;
			bool isex=true;
			while(isex) {
				isex=false;
				for(int i=2; i<=n-1+4; i++) {
					temp=d1.substr(i-2,3);
					if(temp=="..L"||temp=="L.L") {
						d2[i-1]='L';
						isex=true;
					}
					if(temp=="R.."||temp=="R.R") {
						d2[i-1]='R';
						isex=true;
					}
				}
				//cout<<d2.substr(2,n)<<endl;
				d1=d2;
			}
			return d1.substr(2,n);

		}
};

執行用時: 692 ms, 在Push Dominoes的C++提交中擊敗了0.99% 的使用者