题目来源:https://leetcode.cn/problems/swap-adjacent-in-lr-string/

大致题意:
给两个由 L、R、X 组成的字符串 start 和 end,其中字符串 start 中的 XL 可以被替换为 LX,RX 可以被替换为 XR。
求字符串 start 替换之后能否变成字符串 end

思路

已知第一个字符串中的 XL 可以被替换为 LX,RX 可以被替换为 XR

那么等价于在 L 左侧是 X 时,L 可以左移一位;R 右侧是 X 时,R 可以右移一位

那么什么情况下,L 需要左移呢?

举个例子,字符串 start 为 XXXLX,end 为 LXXXX,这时候就可以通过左移 start 中的 L 使 start 变为 end。而以下情况则不需要左移

  • start 为 XLXXX,end 为 XXLXX。start 中的 L 在 end 左侧,而 L 只能左移,此时 start 无法变为 end

同理,当 start 中有 R 在 end 左侧时,可以通过右移 R 使位置相同,将 start 变为 end。但是start 中 R 在 end 右侧时则不可以

还有一种情况

  • start 为 XRXLX,end 为 XLRXX。可以看到,在 R 右移时由于遇到右侧 的 L 会无法右移,L 左移时也会碰到 R 而无法左移,造成 start 无法变为 end

综合以上情况,可以使用双指针表示当前两个字符串的遍历位置,然后根据遍历位置的字符做如下判断。这里假设 idx1 表示 start 的遍历指针,idx2 表示 end 的遍历指针

  • 若 idx1 和 idx2 对应字符有一个为 X,则对应的指针 +1
  • 若 idx1 和 idx2 对应字符都不为 X。如果字符不相同,表示 L 遇到 R,或者 R 遇到 L,即 start 不能变为 end,直接返回 false;如果 idx1 对应字符为 L 且当前 idx1 指针在 idx2 左侧,或者 idx1 对应字符为 R 且当前 idx1 指针在 idx2 右侧,则为上述 start 不能变为 end 的条件,返回 false;否则,表示start 目前遍历的 L 和 R 移动后能与 end 对应位置一致,更新指针值
  • 若 idx1 已经等于 start 长度,或者 idx2 已经等于 end 长度,则更新对方的指针值,并且判读对方字符是否为 X,若不为 X 表示两字符串含有的 L 或者 R 数量不同,返回 false

具体看代码:

class Solution {public boolean canTransform(String start, String end) {int n = start.length();// 初始化指针值int idx1 = 0;int idx2 = 0;// 当有一个指针未到对应字符串末尾时,遍历检查while (idx1 < n || idx2 < n) {// 若 start 已经遍历结束if (idx1 == n) {// 判断 end 是否有非 X 字符if (end.charAt(idx2++) != 'X') {return false;}continue;}// 若 end 已经遍历结束if (idx2 == n) {// 判断 start 是否有非 X 字符if (start.charAt(idx1++) != 'X') {return false;}continue;}// 若双指针对应字符都不为 Xif (start.charAt(idx1) != 'X' && end.charAt(idx2) != 'X') {// 如果对应字符不相同,直接返回 falseif (start.charAt(idx1) != end.charAt(idx2)) {return false;}// 判断是否有 start L 在 end L 左侧// 或者 start R 在 end R 右侧的情况if ((start.charAt(idx1) == 'L' && idx1 < idx2) || (start.charAt(idx1) == 'R' && idx1 > idx2)) {return false;}// 更新指针idx1++;idx2++;} else if (start.charAt(idx1) == 'X') {  // 更新对应位置为 X 的指针值idx1++;} else {idx2++;} }return true;}
}

力扣 777. 在LR字符串中交换相邻字符相关推荐

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

    777. 在LR字符串中交换相邻字符 在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作.一次移动操作指用一个"L ...

  2. Java实现 LeetCode 777 在LR字符串中交换相邻字符(分析题)

    777. 在LR字符串中交换相邻字符 在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作.一次移动操作指用一个"L ...

  3. LeetCode 777. 在LR字符串中交换相邻字符(双指针)

    1. 题目 在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作.一次移动操作指用一个"LX"替换一个&q ...

  4. leetcode 777. Swap Adjacent in LR String | 777. 在LR字符串中交换相邻字符(双指针)

    题目 https://leetcode.com/problems/swap-adjacent-in-lr-string/ 题解 本来以为是个带 visited 集合的 DFS,一看数据量,居然是 10 ...

  5. 零尽其用,尾随不落——探究力扣题目“移除字符串中的尾随零”的解题思路

    本篇博客会讲解力扣"2710. 移除字符串中的尾随零"的解题思路,这是题目链接. 先来审题: 以下是示例: 以下是提示: 本题的思路是: 先遍历字符串,找到字符串末尾的\0. 从\ ...

  6. LeetCode(力扣)初级算法 字符串篇

    目录 1.反转字符串 2.整数反转 2.1第一版代码 2.2第二版代码 3.字符串中的第一个唯一字符 3.1第一版代码 3.2第二版代码 3.3第三版代码 4.有效的字母异位词 4.1第一版代码 4. ...

  7. php 替换某个字符,php中如何替换字符串中的某个字符-PHP问题

    正在PHP中,能够应用strtr()函数完成字符串交换. 起首咱们简略理解下strtr()函数的界说及语法. 语法: string strtr( string $str, string $from, ...

  8. 单词记忆系统二:音标字符输入(re从字符串中提取音标字符;依序打印音标字符;输入对应序号;替换序号。-> 完成“音标输入”)

    Python 官网:https://www.python.org/ Free:大咖免费"圣经"教程< python 完全自学教程>,不仅仅是基础那么简单-- My CS ...

  9. 把一个字符串中的所有字符按从小到大排序。

    7-4 把一个字符串中的所有字符按从小到大排序 输入格式: 在一行中输入长度小于20的字符串.在字符串中不要出现换行符,制表符. 输出格式: 直接输出排序后的字符串. 输入样例: asdfg 输出样例 ...

最新文章

  1. LeetCode简单题之二分查找
  2. FORM 中的颜色 Visual Attribute
  3. Web性能API——帮你分析Web前端性能
  4. 5W+人的公司怎么把总部和分部网络连接起来?
  5. 标准模板库(STL)学习指南之set集合
  6. 秦汉考场科目三路线图_我在青竹湖考场考科三的一些分享
  7. android的帧布局,七、Android帧布局FrameLayout和霓虹灯效果
  8. 如何构建基于.NET Core和云环境下的微服务技术体系?
  9. 利用预渲染加速iOS设备的图像显示
  10. WEB.NET error:请添加一个名为 jquery (区分大小写)的 ScriptResourceMapping 解决方案
  11. C#实现实时监控文件目录下的变化
  12. PIPI-OJ BUG log
  13. error pulling image configuration: read tcp xxx.xxx.x.xxx:xx->xxx.xx.xxx.xx:xxx: read: connection
  14. phpstudy打开浏览php页面发现显示源码解决方法
  15. 练习3 - 铲雪车(snow)
  16. 深度学习这些年那些超重要的idea回顾总结
  17. 火焰传感器与 Arduino 连接
  18. 阿卡索口语学习(Learn And Talk 0)短语及单词(二)
  19. Photoshop从入门到放弃
  20. 嵌入式技术栈之spi协议的时序

热门文章

  1. 非管理系考PMP证书有用吗?
  2. 没做过项目经理可以考pmp证书吗?普通人考PMP®有用吗?
  3. Unity Custom PBR材质
  4. 什么是MTTF和MTBF和MTRF
  5. LeCo-82.删除排序链表中的重复元素(二)
  6. 区块链为什么叫区块链
  7. rm -rf 误删除数据如何进行恢复
  8. Hive误删除后,如何恢复数据
  9. 个人作业 Alpha项目测试
  10. shineblink MQ-3酒精浓度探测