**Leetcode 777. Swap Adjacent in LR String
阿新 • • 發佈:2019-01-05
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; } };