持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情
大家好 我是丝瓜咸蛋汤。今天带来的是一道在LeetCode上的题目,题目难度为中等
。就在此为大家分享一下解答思路。
题目阐述
在一个由 '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
思路阐述
解决这个问题的关键是'L'的索引和'R'的索引
这意味着如果“L”在开始时位于“X”的左侧,则通过变换它将位于“X”的右侧。
因此,将开头的“L”索引与结尾的“L”索引进行比较。如果前者多于后者,return false
。
所以我们在这会使用双指针去遍历整个字符串记录当前的l和r的出现个数,通过对比在两个字符串里L
和R
的位置来判断能否通过移动操作完成字符串的转换。
代码实现
function canTransform(start: string, end: string): boolean {
let l = 0,
r = 0;
for (let i = 0; i < start.length; i++) {
if (
(start.charAt(i) == "R" && l < 0) ||
(start.charAt(i) == "L" && r > 0)
) {
return false;
}
r += start.charAt(i) == "R" ? 1 : 0;
l += start.charAt(i) == "L" ? 1 : 0;
r -= end.charAt(i) == "R" ? 1 : 0;
l -= end.charAt(i) == "L" ? 1 : 0;
if ((l != 0 && r != 0) || l > 0 || r < 0) {
return false;
}
}
return (l == r)&&l == 0;
}
我是丝瓜咸蛋汤
一名热爱阿森纳的前端工程师
如果本文对您有帮助,可以给一个免费的赞吗?谢谢!