描述
在一个由 ‘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'。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/swap-adjacent-in-lr-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析
剔除"X"之后若两个字符串不相等,则一定不可能交换成功。
剔除"X"之后相等,说明start与end的"L",“R"相对次序是一致的,能不能通过交换变得相同要看"L”,"R"的有没有足够的空间移动。
"L"只能向左移动,因此若start的"L"相对与end的"L"在左侧,则无论如何也不能通过移动使得与end的"L"位置相同。
"R"只能向右移动,若start的"R"的位置在end的"R"的右侧,则无论如何也不能通过交换"X"移动到end的"R"位置。
class Solution {
public boolean canTransform(String start, String end) {
if (!start.replace("X","").equals(end.replace("X",""))) {
return false;
}
int i = 0, j = 0, n = start.length();
while (i < n && j < n) {
while (i < n && start.charAt(i) == 'X') i++;
while (j < n && end.charAt(j) == 'X') j++;
if (i < n && start.charAt(i) == 'L') {
if (i < j) return false;
} else {
if (i > j) return false;
}
i++;
j++;
}
return true;
}
}