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