알고리즘/leetcode

Push Dominoes

유이얼 2021. 7. 22. 00:59
// mine
// 40ms, 16.6MB
class Solution {
public:
    string pushDominoes(string dominoes) {
        int size = dominoes.size();
        vector<int> counter(size);
        char prev = dominoes[0];
        int count = 0;

        for (int i = 1; i < size; ++i) {
            char cur = dominoes[i];
            if (cur == '.' && prev == 'R')
                counter[i] = ++count;
            if (cur == 'L' || cur == 'R') {
                count = 0;
                prev = cur;
            }
        }

        prev = dominoes[size - 1];
        count = 0;
        for (int i = size - 2; i >= 0; --i) {
            char& cur = dominoes[i];
            if (cur == '.' && prev == 'L') {
                ++count;
                if (counter[i] == 0 || counter[i] > count) cur = 'L';
                else if (counter[i] < count) cur = 'R';
                else cur = 'C';
                continue;
            }
            if (cur == 'L' || cur == 'R') {
                count = 0;
                prev = cur;
            }
        }

        for (int i = 0; i < size; ++i) {
            char& cur = dominoes[i];
            if (counter[i] && cur == '.') cur = 'R';
            if (cur == 'C') cur = '.';
        }
        return dominoes;
    }
};
// 4ms
class Solution {
public:
    string pushDominoes(string dominoes) {
        char prev = 'L';
        int l = -1;
        int curr = 0;
        int n = dominoes.length();
        while (curr < n) {
            if (dominoes[curr] == '.') {
                curr++;
            } else {
                if (dominoes[curr] == 'R') {
                    if (prev == 'R') {
                        for (int i=l+1; i<curr; i++) dominoes[i] = 'R';
                    }
                    prev = 'R';
                    l = curr;
                } else {
                    if (prev == 'L') {
                        for (int i=l+1; i<curr; ++i) dominoes[i] = 'L';
                    } else {
                        int f = l+1, s = curr-1;
                        while (f < s) {
                            dominoes[f++] = 'R';
                            dominoes[s--] = 'L';
                        }
                    }
                    prev = 'L';
                    l = curr;
                }
                curr++;
            }
        }
        if (prev == 'R') {
            for (int i=l+1; i<n; i++) dominoes[i] = 'R';
        }
        return dominoes;
    }
};
// 9000 KB
class Solution {
public:
    string pushDominoes(string d) {
        int n=d.length();
        if(n==1)
            return d;
        int l=0,r=0;
        int i=0;
        while(i<n){  
            if(d[i] == 'L' || d[i] == 'R'){
                i++;
                continue;
            } 
            
            if(i<n){     
            l=i;
            r=l;
            
            while(d[r] == '.' && (r<n)){
                r++;
            }
            r--;
            i=l+1;
            if(l==r){
                if(l==0 && d[l+1]=='L'){
                    d[l]=d[l+1];
                   
                }
                else if(l==n-1 && d[l-1]=='R')
                    d[l]=d[l-1];
                else if(l>0 && l<n-1 && (d[l-1] == d[l+1])){
                    d[l]=d[l+1];
                }
                
            }  
            else{            
                if(l <= r){
                    if(l==0 && r==n-1)
                        return d;
                    if(l==0 && d[r+1] == 'L'){
                    while(l!=r+1)
                        d[l++]=d[r+1];  
                         
                    } 
                    if(r==n-1 && d[l-1] == 'R'){
                        while(l!=r+1){
                        d[l++]='R';
                        }
                    
                    }
                    else if(l>0 && r<n-1){
                    if(d[l-1] == 'R'){
                        d[l] = 'R';
                    }
                    if(d[r+1] == 'L'){
                        d[r] = 'L';
                        i=l;
                    }
                    }

                }
            }
        }
        }
        // cout<<d;
        return d;
    }
};

https://leetcode.com/explore/challenge/card/july-leetcoding-challenge-2021/610/week-3-july-15th-july-21st/3821/