【LeetCode】智商題 brainteaser(共3題)

【292】Nim Game ide

 

【319】Bulb Switcher spa

 

【777】Swap Adjacent in LR String (2019年2月13日,谷歌tag)code

給了兩個字符串start 和end,問經過以下兩個規則能不能通過必定的變換,把start變成end。orm

規則1: "XL" -> "LX" blog

規則2:"RX"->"XR"字符串

題解:我一開始還覺得貪心能解。結果==,舉個例子 start = "XXXXXLXXXX" end = "LXXXXXXXXX",這樣是可以變換過去的。string

經過觀察咱們能夠獲得以下的結論:L只能往左移動,R只能往右移動,並且兩個都是隻能和X交換。因此。咱們能夠檢查整個字符串除了X以外的全部字符LR,看start和end除了X以外的字符是否是相等。若是不是,那麼確定不能變換出來。it

還有,由於L只能往左邊移動,並且只能和X交換。那麼咱們start中的L若是它的下標位置比end中的L的下標位置小的話,這樣確定是不行的。同理R。io

時間複雜度是O(N)event

 1 class Solution {
 2 public:
 3     bool canTransform(string start, string end) {
 4         const int n = start.size();
 5         int p1 = 0, p2 = 0;
 6         while (p1 < n && p2 < n) {
 7             while (p1 < n && start[p1] == 'X') {++p1;}
 8             while (p2 < n && end[p2] == 'X') {++p2;}
 9             if (p1 == n && p2 == n) {break;}
10             if (p1 < n && p2 == n || p1 == n && p2 < n || start[p1] != end[p2]) {return false;}
11             if (start[p1] == 'L' && p1 < p2) {return false;}
12             if (start[p1] == 'R' && p1 > p2) {return false;}
13             ++p1, ++p2;
14         }
15         return true;
16     }
17 };
View Code
相關文章
相關標籤/搜索