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'
。
解决方案
方法一:模拟
根据题意进行分析模拟,题目将每一个XL
都替换成了LX
,将每一个RX
都替换成了XR
通过找规律可发现,替换的过程可以理解为L
与R
移动的过程。
当
L
的左边为X
时,L
可向左移动当
R
的右边为X
时,R
可向右移动L
与R
无法互相穿过(因为L
左和R
右必须为X
)- 可得知当
start
与end
去掉X
后,剩余字符必须相同,否则返回False
- 可得知当
根据此规律,使用双指针i
与j
从头到尾遍历start
与end
找到start
与end
中非X
的字符时则停止移动,进行判断
判断条件为:
若
start[i] == L and i < j
,又因L
无法向右移动,直接返回False若
start[i] == R and i > j
,又因R
无法向左移动,直接返回False
当双指针遍历字符串结束后,说明中途未返回False,则最终返回True
注意:
if i != j and (start[i] == 'L') != (i > j)
该行代码摘自灵山茶艾府大佬的题解,相当于将两个if
判断条件揉为一个,其本质为:
if i < j and start[i] == 'L': return False
if i > j and start[i] == 'R': return False
Python3
|
|
Java
|
|
Encouragement
目前就读于新加坡国立大学,转码菜鸡一枚。
决心通过日更一篇题解激励自己坚持刷题,坚持学习算法。
这是我搭建Leetcode-Everyday仓库后发布の第5篇题解,欢迎各位star并提出Issue~
点击这里,进入我的个人Leetcode主页~