0字符串中等 LeetCode777. 在LR字符串中交换相邻字符

777. 在LR字符串中交换相邻字符

描述

在一个由 ‘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;
    }
}

你可能感兴趣的:(leetcode,算法,职场和发展)