题目描述:
本题目思路为先正序遍历标记所有右倒倾向的骨牌,然后再倒序遍历标记所有向左倒倾向的骨牌。当一个骨牌既有右倾也有左倾的时候将其标记为待判定状态,在本程序中用“1”表示右倾,“2”表示左倾,“3”表示待判定状态。
最后用双指针方式来对待判定状态的骨牌做最终判定,即从左右两头向中间更改状态。
这样做的好处是不用做额外的如“R..R..”等类型骨牌的判定,只需要最终做中间态骨牌判定即可。
完整代码如下:
string pushDominoes(string dominoes) {
vector<int>x(dominoes.size(),0);
bool isok=false;
for(int i=0;i<dominoes.size();i++){
if(dominoes[i]=='L'){
isok=false;
continue;
}
if(isok)x[i]=1;
if(dominoes[i]=='R'){
isok=true;
continue;;
}
}
isok=false;
for(int i=dominoes.size()-1;i>=0;i--){
if(dominoes[i]=='R'){
isok=false;
continue;
}
if(isok){
if(x[i])x[i]=3;
else x[i]=2;
}
if(dominoes[i]=='L'){
isok=true;
continue;;
}
}
for(int i=0;i<dominoes.size();i++){
if(x[i]==1)dominoes[i]='R';
else if(x[i]==2)dominoes[i]='L';
else if(x[i]==3){
int ii=i;
int num=1;
i++;
while(x[i]==3){
num+=1;
i++;
}
i--;
int jj=i;
while(ii!=jj&&ii<jj){
dominoes[ii]='R';
dominoes[jj]='L';
ii++;
jj--;
}
}
}
return dominoes;
}