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

195 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。