Leetcode 2337 -- 双指针 | 脑筋急转弯

题目描述

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

给定我们一个只由 ′ L ′ , ′ R ′ , ′ X ′ 'L','R','X' ′L′,′R′,′X′ 组成的字符串。现在给你两个字符串 s t a r t start start 和 e n d end end,问你能否通过以下两个字符串变换,将字符串 s t a r t start start 变换为 e n d end end。

  1. X L → L X XL \rightarrow LX XL→LX
  2. R X → X R RX \rightarrow XR RX→XR
    如果你观察仔细,你可以从上述两个变换发掘以下两个性质:
  3. L L L 只能向左移动,并且左边的元素必须是 X X X
  4. R R R 只能向右移动,并且右边的元素必须是 X X X

思路1: bfs

T L E TLE TLE

暴力 b f s bfs bfs 的思路比较简单,暴力枚举所有交换即可。

但是超时也是意料之中的,不过我们可以增加一个优化,比如:A*, 剪枝(如果两个字符串的对应字符相同就不需要交换)等尽可能多得分。

思路2:双指针

首先,无论怎么移动,由于 L L L 和 R R R 无法互相穿过对方,那么去掉 X X X 后的剩余字符应该是相同的,否则返回 f a l s e false false。

然后, s t a r t start start 中 L L L 的位置一定在target中对应的 L L L 的右侧或者在同一位置
s t a r t start start 中 R R R 的位置一定在 t a r g e t target target 中对应的 R R R 的左侧或者在同一位置(参见题目描述中的性质)

那么,接下来我们就用双指针遍历 s t a r t i starti starti 和 t a r g e t j targetj targetj,找到 s t a r t i starti starti 和 t a r g e t j targetj targetj 都不位 'X' 的字符,判断它们的相对位置

分类讨论:

如果当前字符为 L L L 且 i < j i<j i<j,那么这个 L L L 由于无法向右移动,返回 f a l s e false false;

如果当前字符为 R R R 且 i > j i>j i>j,那么这个 R R R 由于无法向左移动,返回 f a l s e false false。

遍历完,若中途没有返回 f a l s e false false 就返回 t r u e true true。

双指针代码

c++ 复制代码
class Solution {
public:
    bool canChange(string start, string target) {
        auto s = start, t = target;
        // remove是将匹配的元素都放在后面,返回匹配的第一个元素的迭代器,然后erase删除迭代器
        s.erase(remove(s.begin(), s.end(), '_'), s.end());
        t.erase(remove(t.begin(), t.end(), '_'), t.end());
        // 判断删除后长度和相对顺序,若不同则返回false
        if (s != t) return false;
        for (int i = 0, j = 0; i < start.length(); ++i) {
            if (start[i] == '_') continue;
            while (target[j] == '_') ++j;
            // 若i=j,则说明一定匹配(因为在for循环上面的判断中保证了相对顺序)
            // 若L:则它不能向右移动 i < j
            // 若R:则它不能向左移动 j < i
            if (i != j && (start[i] == 'L') == (i < j)) return false; // 一行判三种情况
            ++j;
        }
        return true;
    }
};

相似题目

移动片段得到字符串

相关推荐
KaMeidebaby1 小时前
卡梅德生物技术快报|bli亲和力检测gst:告别批量跑胶:BLI实时酶切监测技术加速GST融合蛋白下游流程优化
前端·网络·数据库·人工智能·算法
alphaTao1 小时前
LeetCode 每日一题 2026/7/20-2026/7/26
算法·leetcode
圣保罗的大教堂2 小时前
leetcode 3514. 不同 XOR 三元组的数目 II 中等
leetcode
青山木5 小时前
Hot 100 ---腐烂的橘子
java·数据结构·后端·算法·leetcode·广度优先
未来之窗软件服务5 小时前
计算机考试-快速排序—东方仙盟
数据结构·算法·排序算法·仙盟创梦ide·东方仙盟
小龙报5 小时前
【优选算法】1. 水果成蓝 2.找到字符串中所有字母的异位词
java·c语言·数据结构·数据库·c++·redis·算法
txzrxz6 小时前
数论:排列数、组合数、费马小定理、逆元、同余定理
c++·算法·数论·组合数·费马小定理·逆元·排列数
xqqxqxxq6 小时前
LeetCode Hot100 双指针专项题解笔记
笔记·算法·leetcode
闪电悠米6 小时前
力扣hot100-54.螺旋矩阵-模拟边界控制详解
算法·leetcode·矩阵
变量未定义~6 小时前
虚拟节点-星石传送阵(4星)、强连通分量
数据结构·算法