LeetCode竞赛题目—在LR字符串中交换相邻字符

简介: LeetCode竞赛题目—在LR字符串中交换相邻字符

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

在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作。一次移动A操作指用一个"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

startend中的字符串仅限于'L', 'R''X'

解答思路:双指针

这个题目说实话,会的是感觉真会,不会的是想破脑袋也解不出来(当然还伴随头疼哈哈哈),我在拿到这个题目的时候想到了双指针法,当然,光是想到方法还不行,还必须实现出来(不瞒你们说,这题我解了将近1个小时哈哈哈)好,废话不多说,开始我们的思路!

分析:

拿到题目时,首先要明确我们的目标-->用一系列操作使得start可以转换成end时, 返回True。

那么操作是什么呢?"LX"替换一个"XL",或者用一个"XR"替换一个"RX",看到这里我们还是一脸懵逼,别急,我们接着看这个操作的内容,"LX"替换"XL"说明了什么?说明start中的L必须在对应的end中L的右边,那么"XR"替换"RX"是不是就说明了start中的R必须在end中R的左边!!这样思路就清晰一点。我们拿示例画个草图理解一下:

当位置不对应的时候,直接返回false,对应的情况下我们就可以想到用双指针来比较其位置,当我们的两个指针指向内容都是R或者L的时候记录其下标,然后进行比较,比较什么?前面说过,start中的L位置必须比end的大,也就是假如我们定义i指针指向start。j指向end的时候,当i指向的值是L的时候,i必须要大于j,否则返回false,同理,当i指向的值是R的时候,i必须小于j,否则返回false。如果执行跳出了循环,则说明所有的条件都满足了,返回true!解答完毕!,详细情况请看解题代码部分。

Java解题代码:  

1. class Solution {
2. public boolean canTransform(String start, String end) {
3. 
4. int i=0;
5. int j=0;
6. int len=start.length();
7. //如果去掉所有X后不能相等就false
8. if(!start.replaceAll("X","").equals(end.replaceAll("X","")))
9. return false;
10. //相等之后判断是否满足条件
11. while(i<len&&j<len){
12. 
13. while(i<len&&start.charAt(i)=='X'){
14.                 i++;
15.             }
16. while(j<len&&end.charAt(j)=='X'){
17.                 j++;
18.             }
19. 
20. //进行判断,如果是L,则i必须>j
21. //如果是R,则i必须小于j
22. if(i<len&&j<len&&start.charAt(i)=='L'&&i<j){
23. return false;
24.             }
25. if(i<len&&j<len&&start.charAt(i)=='R'&&i>j){
26. return false;
27.             }
28.             i++;
29.             j++;
30.         }
31. 
32. return true;
33. 
34.     }
35. }


相关文章
|
15天前
|
JavaScript
力扣3333.找到初始输入字符串Ⅱ
【10月更文挑战第9天】力扣3333.找到初始输入字符串Ⅱ
30 1
|
29天前
|
C++
Leetcode第43题(字符串相乘)
本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
23 9
|
29天前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
15 0
LeetCode第二十四题(两两交换链表中的节点)
|
29天前
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
15 0
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
54 6
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
107 2
|
9天前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
10 1
|
2月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
3月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
54 7