持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情
🎈算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道中等难度的题目 -> 在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'。
思路分析
首先我们要先理解一下题意,找到可以解题的关键信息。
- 1、字符串仅限于
'L','R'和'X' - 2、用一个"LX"替换一个"XL" 或者 用一个"XR"替换一个"RX"
关键信息
从这两点我们可以知道这样一个信息:
- 1、用一个"LX"替换一个"XL"
即start字符串中的L字符只能向左移动
- 2、用一个"XR"替换一个"RX"
即start字符串中的R字符只能向右移动
所以我们只需要判断字符串start中字符R左边的字符L数量与end中相同子串中的L字符数量是否相同;start中字符L左边的字符L数量与end中相同子串中的R字符数量是否相同。
解题步骤
- 1、记录两字符串中字符出现的数量
let Ln = [0,0],Rn = [0,0];
for(let i = 0; i < start.length; i++){
……
if(start[i] == 'L') Ln[0]++;
else if(start[i] == 'R') Rn[0]++;
if(end[i] == 'L') Ln[1]++;
else if(end[i] == 'R') Rn[1]++;
}
- 2、start中字符
R左边的字符L数量与end中相同子串中的L字符数量是否相同
start[i] == 'R' && (Ln = [0,0]);
- 3、start中字符
L左边的字符L数量与end中相同子串中的R字符数量是否相同
start[i] == 'L' && (Rn = [0,0]);
- 4、判断两字符中出现的各字符数量是否相同
return start.split('').sort().join('') == end.split('').sort().join('');
AC代码
/**
* @param {string} start
* @param {string} end
* @return {boolean}
*/
var canTransform = function(start, end) {
let Ln = [0,0],Rn = [0,0];
for(let i = 0; i < start.length; i++){
start[i] == 'R' && (Ln = [0,0]);
start[i] == 'L' && (Rn = [0,0]);
if(start[i] == 'L') Ln[0]++;
else if(start[i] == 'R') Rn[0]++;
if(end[i] == 'L') Ln[1]++;
else if(end[i] == 'R') Rn[1]++;
if(Ln[1] < Ln[0] || Rn[0] < Rn[1]) return false;
}
return start.split('').sort().join('') == end.split('').sort().join('');
};
说在后面
🎉这里是JYeontu,喜欢算法,GDCPC打过卡;热爱羽毛球,大运会打过酱油。毕业一年,两年前端开发经验,目前担任H5前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。