Note:
宽搜模拟一下就爆时间了,还是得搞花里胡哨的
首先,去掉下划线之后,两个字符串得是一样的
我不会调用库函数,就分两步走,先判断L和R的数量是不是一样的
之后在后面去判断有没有连续的相互错位
然后两个指针都从头开始遍历两个字符串
如果start找到了L,并且i < j
那么说明这个L的正确位置在右边,他已经挪不过去了,return false;
如果start找到了R,并且i > j
那么说明这个R的正确位置在左边,他也挪不过去了,return false;
代码里比较高级的地方是,不用两个判断了,因为他俩是正好相反的条件,直接用==判断是不是同时成立
代码如下:
class Solution {
public:
bool canChange(string start, string target) {
int l1 = 0, l2 = 0, r1 = 0, r2 = 0;
for(auto& c: start)
if(c == 'L') l1 ++;
else if(c == 'R') r1 ++;
for(auto& c: target)
if(c == 'R') r2 ++;
else if(c == 'L') l2 ++;
if(l1 != l2 || r1 != r2) return false;
for(int i = 0, j = 0; i < start.length(); i ++){
if(start[i] == '_') continue;
while(target[j] == '_') j ++;
if(i != j && ((start[i] == 'L') == (i < j)) ) return false;
if(i == j && start[i] != target[i]) return false;
j ++;
}
return true;
}
};