【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 };