算法笔记-lc-777. 在LR字符串中交换相邻字符(简单)

面试算法——3.从初始字符串开始,相邻交换,得到目标字符串 将“GUW”转化为“WUG”,仅相邻的字符能够互换位置,打印互换每一步的结果。 阅读详情

算法笔记-lc-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’ 左侧的相邻字符是‘X’,则将字符 ‘L’ 向左移动一位,将其左侧的 ‘X’ 向右移动一位;

如果一个字符‘R’ 右侧的相邻字符是‘X’,则将字符 \text{`R’}‘R’ 向右移动一位,将其右侧的 ‘X’ 向左移动一位。

由于每次移动操作只是交换两个相邻字符,不会增加或删除字符,因此如果可以经过一系列移动操作将start 转换成 end,则start 和 end 满足每一种字符的数量分别相同,字符‘R’ 的相对顺序相同,且每个‘L’ 在end 中的下标小于等于对应的‘L’ 在 start 中的下标,以及每个 ‘R’ 在end 中的下标大于等于对应的 ‘R’ 在 \textit{start}start 中的下标。

因此,可以通过判断start 和 end 中的所有‘L’ 和‘R’ 是否符合替换后的规则,判断是否可以经过一系列移动操作将 start 转换成end。

用 n 表示start 和end 的长度,用 i 和 j 分别表示start 和 end 中的下标,从左到右遍历start 和end,跳过所有的 ‘X’,当 i 和 j都小于 n 时,比较非 ‘X’ 的字符:

如果 start[i] !=end[j],则 start 和 end 中的当前字符不匹配,返回 false;

如果 start[i]=end[j],则当前字符是 ‘L’ 时应有i≥j,当前字符是‘R’ 时应有i≤j,如果当前字符与两个下标的关系不符合该规则,返回false。

如果 i 和 j 中有一个下标大于等于 n,则有一个字符串已经遍历到末尾,继续遍历另一个字符串中的其余字符,如果其余字符中出现非 ‘X’ 的字符,则该字符不能与任意字符匹配,返回 false。

如果 start 和 end 遍历结束之后没有出现不符合移动操作的情况,则可以经过一系列移动操作将start 转换成 end,返回true。

class Solution {
    public boolean canTransform(String start, String end) {
        int n = start.length();
        int i = 0, j = 0;
        while (i < n && j < n) {
            while (i < n && start.charAt(i) == 'X') {
                i++;
            }
            while (j < n && end.charAt(j) == 'X') {
                j++;
            }
            if (i < n && j < n) {
                if (start.charAt(i) != end.charAt(j)) {
                    return false;
                }
                char c = start.charAt(i);
                if ((c == 'L' && i < j) || (c == 'R' && i > j)) {
                    return false;
                }
                i++;
                j++;
            }
        }
        while (i < n) {
            if (start.charAt(i) != 'X') {
                return false;
            }
            i++;
        }
        while (j < n) {
            if (end.charAt(j) != 'X') {
                return false;
            }
            j++;
        }
        return true;
    }
}

复杂度分析

时间复杂度:O(n),其中 n 是字符串start 和end 的长度。需要遍历两个字符串各一次。

空间复杂度:O(1)。只需要使用常量的额外空间。

【信息科学与工程学】【通信工程】第二百四十篇 IPv4/IPv6 功能点、特性和算法及 IPv4→IPv6 迁移特性02 说明:按「纯数学 → 数学物理 → 多物理场 → 界面/表面科学耦合 + 数学化学 + 运动科学(0.01 nm → μm → mm → cm 精度及超长运动)」纵向穿透,每一行给出,最后挂。 阅读详情

相关推荐

vue项目基于WebRTC实现一对一音视频通话

vue项目基于WebRTC实现一对一音视频通话。完整代码gitee地址: https://gitee.com/wade-nian/wdn-webrtc.git。

qq_920189602的博客 6648

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

题目描述: 在一个由 ‘L’ , ‘R’ 和 ‘X’ 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作。一次移动操作指用一个"LX"替换一个"XL",或者用一个"XR"替换一个"RX"。现给定起始字符串start和结束字符串end,请编写代码,当且仅当存在一系列移动操作使得start可以转换成end时, 返回True。 示例 : 输入: start = “RXXLRXRXL”, e...

qq_34446716的博客 433

Cadence仿真笔记(二):传统noise仿真—共源极的噪声

cadence中进行传统噪声仿真

Bao_xue的博客 1万+

编程题收集

编程题

peaktravel的专栏 540

在Jetson Orin (Arm64)上从Ubuntu22.04回退至20.04的完整指南及ROS-noetic适配方案

本文提供了在Jetson Orin (Arm64)设备上将Ubuntu 22.04系统回退至20.04 LTS版本的完整操作指南。针对机器人开发中ROS-noetic对Ubuntu20.04的官方最佳支持,详细阐述了从关键备份、软件源与APT优先级配置、系统降级执行到后续问题排查的全过程,并附带了在Arm64架构上成功安装和验证ROS-noetic的适配方案,旨在为开发者构建稳定可靠的机器人开发环境。

flower的专栏 580

SAP PP CSAP_MAT_BOM_MAINTAIN ECN 增加组件

SAP PP CSAP_MAT_BOM_MAINTAIN ECN 增加组件。

GAVIN 409

交换字符串(输入位置后前后交换)

一个根据输入的位置来交换字符串的小工具。

Riven____的博客 2776

距离多普勒谱(RD谱)绘制方法及理解

RD谱是信号处理领域常用的图形。原始信号往往是一维时域序列,如何将其二维化,并进行变换生成RD谱呢?由于刚刚接触,查阅了网络上、老师手里的资料,发现RD谱的绘制方法并不统一,有些存在一定问题。在此,将心得体会记录下来。

mddh_123的博客 3万+

如何交换python相邻两字符的位置

可以使用字符串切片来交换Python中相邻两字符的位置:str = "Python" str = str[1] + str[0] + str[2:] print(str) 交换完成后,输出结果为:ytonsP

weixin_42592399的博客 1251

【RH850/U2A】:功能安全

功能安全相关

3130

基于YOLOv8的城市违建识别系统:从数据集构建到UI界面实现

YOLOv8是Ultralytics公司于2023年推出的最新一代YOLO(You Only Look Once)系列目标检测算法。更高效的骨干网络设计改进的锚框机制更精确的损失函数支持分类、检测、分割等多任务YOLOv8特别适合像违建识别这样的实时检测任务,能够在保持高精度的同时实现快速推理。

YOLO 674

算法: 相邻字符的交换次数

一个数组中只有两种字符’G’和’B’,可以让所有的G都放在左侧,所有的B都放在右侧, 或者可以让所有的G都放在右侧,所有的B都放在左侧, 但是只能在相邻字符之间进行交换操作,返回至少需要交换几次举个例子,有如下数组: 仔细观察:此时,交换次数才是最少的。也就是说,应该保存每个相同字符的相对次序。怎么实现,有一个L和R,先分别指向arr[0] 根据题意,所以,我们应该先看:看哪个代价移动的更少......

OceanStar的博客 942

Android Audio其他——数字音频接口(附)

数字音频接口 DAI,即 Digital Audio Interfaces,顾名思义,DAI 表示在板级或板间传输数字音频信号的方式。相比于模拟接口,数字音频接口抗干扰能力更强,硬件设计简单,DAI 在音频电路设计中得到越来越广泛的应用。

小旭的专栏 1028

数组中有两种字符,使相邻字符进行交换排列的算法

假设一个数组中只有两种字符’G’和’B’,可以让所有的G都放在左侧,所有的B都放在右侧;或者让所有的B都在左侧,所有的G都在右侧,但是只能在相邻字符之间进行交换操作,请问至少要交换多少次。

今天没有努力 507

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

腾讯音乐笔试 9.26

腾讯音乐笔试9.26

XGF的碎碎念 1651

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

网易2018校招内推笔试-交错01串

题目:如果一个01串任意两个相邻位置的字符都是不一样的,我们就叫这个01串为交错01串。例如: “1”,”10101”,”0101010”都是交错01串。 小易现在有一个01串s,小易想找出一个最长的连续子串,并且这个子串是一个交错01串。小易需要你帮帮忙求出最长的这样的子串的长度是多少。 输入描述:输入包括字符串s,s的长度length(1 ≤ length ≤ 50),字符串中只包含’0’和’

ljp1919的专栏 1667

排序

小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。 在冒泡排序中,每次只能交换相邻的两个元素。小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符, 则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。 例如,对于字符串 lan 排序,只需要 1 次交换。对于字符串 qiao 排序, 总共需要 4 次交换。 小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要 100 次交 换,可是他忘了吧这个字符串记下来,现在找不到了。 请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字符串

XIQI_1的博客 313

把一个字符串通过相邻字符移位变成另一个字符串 [No. 54]

问题: 给你两个字符串,比如 ABCD 和 DBCA,通过交换相邻字符的位置,把第一个字符串,变成第二个字符串,打印所有的步骤。比如从ABCD到DBCA,步骤是: ABCD ---&gt;BACD---&gt;BCAD---&gt;BCDA---&gt;BDCA---&gt;DBCA 分析: 如果两个字符串里所含的字符是一样的,只是位置不一样,我们是可以证明通过交换相邻的字符,能够从一个字...

java开发指南博客 【转载】 848

2.2判断字符相邻

#include<stdio.h> int main() { char ch1,ch2,ch3; int a,b; scanf("%c%c%c",&ch1,&ch2,&ch3); a=ch1-ch2; b=ch2-ch3; if(((ch1>=‘a’&&ch1<=‘z’)||(ch1>=‘A’&&ch1<=‘Z’))&&((ch2>=‘a’&&ch2<=‘z’)||(ch2

qq_52606374的博客 903

c语言相邻字符串字面量,C语言入门-字符串

还是要继续学习,每天给自己打气。字符数组char word[] = {'h','e','l','l','o'};这不是c语言的字符串,不能用字符串的方式做计算一、字符串char word[] = {'h','e','l','l','o','\0'};区别就是最后多了一个0,这就成为了字符串以0(整数0)结尾的一串字符0或'\0'是一样的,但和'0'不同0标志字符串的结束,但它不是字符串的一部分计算...

weixin_36333893的博客 363

字符串题目:在LR字符串中交换相邻字符

文章目录题目标题和出处难度题目描述要求示例数据范围解法思路和算法代码复杂度分析 题目 标题和出处 标题:在LR字符串中交换相邻字符 出处:777. 在LR字符串中交换相邻字符 难度 5 级 题目描述 要求 在一个由 ‘L’\texttt{`L'}‘L’、‘R’\texttt{`R'}‘R’ 和 ‘X’\texttt{`X'}‘X’ 三个字符组成的字符串(例如 "RXXLRXRXL"\texttt{"RXXLRXRXL"}"RXXLRXRXL")中进行移动操作。一次移动操作指用一个 "LX"\texttt{"

stormsunshine的博客 1019

字串排序(字符串)

【问题描述】 小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。 在冒泡排序中,每次只能交换相邻的两个元素。小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符,则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。 例如,对于字符串 lan 排序,只需要 1 次交换。对于字符串 qiao 排序,总共需要 4 次交换。 小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要 V 次交换,可是他忘了把这个字符串记下来,现在找不到了。 请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字

b_b_lai_lai的博客 1136

字符串互换后字典序最小

问题:给出一个字符串,以及可以互换的位置对,求出互换后字典序最小的。 比如给出字符串dcab,以及可以互换的位置对[[0,3],[1, 2],[0, 2]],则互换后字典序最小的是abcd 思路:第一种方法是广度优先搜索,初始状态为dcab,将初始状态放入队列以及已经访问状态集合中,根据可以互换的位置对扩展新的状态,同时需要记录已经访问的状态。如果新的状态在已访问状态集合中则跳过。代码如下: ...

多看多听多总结 4352

LeetCode每日一题:777. 在LR字符串中交换相邻字符(中等) 双指针

LeetCode每日一题:777. 在LR字符串中交换相邻字符(中等) 双指针

goblin的博客 649

【777. 在LR字符串中交换相邻字符】

LeetCode每日一题 一次移动操作指用一个"LX"替换一个"XL",或者用一个"XR"替换一个"RX"。现给定起始字符串start和结束字符串end,请编写代码,当且仅当存在一系列移动操作使得start可以转换成end时, 返回True。

Coder_ljw的博客 172
上一篇: 算法笔记-lc-1694. 重新格式化电话号码(简单)
下一篇: 算法笔记-lc-1784. 检查二进制字符串字段(简单)
Hell_potato777
博客等级 码龄6年 47粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值