在一个由 'L'
, 'R'
和 'X'
三个字符组成的字符串(例如"RXXLRXRXL"
)中进行移动操作。一次移动操作指用一个"LX"
替换一个"XL"
,或者用一个"XR"
替换一个"RX"
。现给定起始字符串start
和结束字符串end
,请编写代码,当且仅当存在一系列移动操作使得start
可以转换成end
时, 返回True
。
示例 :
输入: start = "RXXLRXRXL", end = "XRLXXRRLX" 输出: True 解释: 我们可以通过以下几步将start转换成end: RXXLRXRXL -> XRXLRXRXL -> XRLXRXRXL -> XRLXXRRXL -> XRLXXRRLX
注意:
1 <= len(start) = len(end) <= 10000
。start
和end
中的字符串仅限于'L'
,'R'
和'X'
。
思路:这道题可以用O(n)的时间复杂度解决,具体基于以下两点观察:
观察一:'L'只可能往左移,'R'只可能往右移,并且如果start中的L和R的顺序及数量和end中的L和R的顺序和数量不同,那么直接返回false。
观察二:start中的L的下标一定比对应end中的L的下标靠右,start中R的下标一定比对应end的R的下标靠左。
参考代码:
class Solution {
public:
bool canTransform(string start, string end) {
int n = start.size();
string s1, s2;
for (int i = 0; i < n; i++) {
if (start[i] != 'X') s1 += start[i];
}
for (int i = 0; i < n; i++) {
if (end[i] != 'X') s2 += end[i];
}
if (s1 != s2) return false;
for (int i = 0, j = 0; i < n && j < n;) {
if (start[i] == 'X') {
i++;
}
else if (end[j] == 'X') {
j++;
}
else {
if ((start[i] == 'L' && i < j) || (start[i] == 'R' && i > j)) return false;
i++;
j++;
}
}
return true;
}
};