1. 程式人生 > >**Leetcode 777. Swap Adjacent in LR String

**Leetcode 777. Swap Adjacent in LR String

https://leetcode.com/problems/swap-adjacent-in-lr-string/description/

那道題沒看直接BFS當然會T掉

資料規模在1W所以不行。 仔細觀察一下會發現, XL轉換到LX,意味著L左移,同理, RX轉換到XR 意味著R右移。於是就可以做了。

另外還有一點,去掉X之後 start end必須是一樣的。否則不行。 因為L和R是無論如何沒辦法交換相對位置的。經評論區提醒已經改了bug。

class Solution {  
public:  
    bool canTransform(string start, string end) {  
        string s, e;  
        for (int i = 0; i < start.size(); i++)   
            if (start[i] != 'X')  
                s = s + start[i];  
        for (int i = 0; i < end.size(); i++)   
            if (end[i] != 'X')  
                e = e + end[i];  
        if (s != e) return false;  
        vector<int> sl, sr, el, er;  
        for (int i = 0; i < start.size(); i++) {  
            if (start[i] == 'L') {  
                sl.push_back( i );  
            }  
            if (end[i] == 'L') {  
                el.push_back(i);  
            }  
            if (start[i] == 'R') sr.push_back(i);  
            if (end[i] == 'R') er.push_back(i);  
        }  
          
        if (sl.size() != el.size() || sr.size() != er.size() ) return false;  
        if (sl.size() + sr.size() == start.size() && start != end) return false;  
        for (int i = 0; i < sl.size(); i++) {  
            if (sl[i] < el[i]) return false;  
              
        }  
  
        for (int i = 0; i < sr.size(); i++) {  
            if (sr[i] > er[i]) return false;  
        }  
          
        return true;  
    }  
};  

在discuss看到的更簡潔的寫法。有一點很值得注意,就是去掉X,Start需要等於end
class Solution {
public:
    bool canTransform(string start, string end) {
        string s, e;
        for (int i = 0; i < start.size(); i++) 
            if (start[i] != 'X')
                s = s + start[i];
        for (int i = 0; i < end.size(); i++) 
            if (end[i] != 'X')
                e = e + end[i];
        if (s != e) return false;
        int sl = 0, sr = 0, el = 0, er = 0;
        for (int i = 0; i < start.size(); i++) {
            if (start[i] == 'L') sl ++;
            if (start[i] == 'R') sr ++;
            if (end[i] == 'L') el ++;
            if (end[i] == 'R') er ++;
            if (er > sr || sl > el ) return false; 
        }
        return true;
    }
};