Skip to the content.

leetcode [777] 在LR字符串中交换相邻字符


Contact me:

Blog -> https://cugtyt.github.io/blog/index
Email -> cugtyt@qq.com
GitHub -> Cugtyt@GitHub


在一个由 ‘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'。

思路来自题解:

原理:在start中,L只能向左移动,R只能向右移动,只有在遇到X的时候可以移动, 因此X相当于是个空格,遇到空格L可以向左移动,R可以向右移动,其他情况不能移动

判定start能否转为end,即

(1)都去除X后,start和end一致

(2)如果L配对成功还需满足 start的下标大于等于 end的下标

如果R配对成功还需满足 start的下标小于等于 end的下标

class Solution:
    def canTransform(self, start: str, end: str) -> bool:
        if len(start) != len(end) or Counter(start) != Counter(end): return False
        start_record = [(i, s) for i, s in enumerate(start) if s in 'RL']
        end_record = [(i, s) for i, s in enumerate(end) if s in 'RL']
        for (s_i, s_s), (e_i, e_s) in zip(start_record, end_record):
            if s_s != e_s:
                return False
            if s_s == 'L' and s_i < e_i:
                return False
            if s_s == 'R' and s_i > e_i:
                return False
        return True