首页 > 其他分享 >Leetcode 2337 -- 双指针&&脑筋急转弯

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

时间:2022-10-03 10:22:15浏览次数:81  
标签:字符 false target 2337 -- start && 字符串 end

题目描述

在LR字符串中交换相邻字符
给定我们一个只由 \('L','R','X'\) 组成的字符串。现在给你两个字符串 \(start\) 和 \(end\),问你能否通过以下两个字符串变换,将字符串 \(start\) 变换为 \(end\)。

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

思路1: bfs

\(TLE\)
暴力 \(bfs\) 的思路比较简单,暴力枚举所有交换即可。
但是超时也是意料之中的,不过我们可以增加一个优化,比如:A*, 剪枝(如果两个字符串的对应字符相同就不需要交换)等尽可能多得分。

思路2:双指针

首先,无论怎么移动,由于 \(L\) 和 \(R\) 无法互相穿过对方,那么去掉 \(X\) 后的剩余字符应该是相同的,否则返回 \(false\)。
然后,\(start\) 中 \(L\) 的位置一定在target中对应的 \(L\) 的右侧或者在同一位置
\(start\) 中 \(R\) 的位置一定在 \(target\) 中对应的 \(R\) 的左侧或者在同一位置(参见题目描述中的性质)
那么,接下来我们就用双指针遍历 \(start[i]\) 和 \(target[j]\),找到 \(start[i]\) 和 \(target[j]\) 都不位 'X' 的字符,判断它们的相对位置

分类讨论:
如果当前字符为 \(L\) 且 \(i<j\),那么这个 \(L\) 由于无法向右移动,返回 \(false\);
如果当前字符为 \(R\) 且 \(i>j\),那么这个 \(R\) 由于无法向左移动,返回 \(false\)。
遍历完,若中途没有返回 \(false\) 就返回 \(true\)。

双指针代码

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;
    }
};

相似题目

移动片段得到字符串

标签:字符,false,target,2337,--,start,&&,字符串,end
From: https://www.cnblogs.com/ALaterStart/p/16750107.html

相关文章

  • 【反射】反射基本使用
    1.获取类信息classStudent{static{System.out.println("加载Student类");}publicStudent(){System.out.println("ConstructStud......
  • 一个编写测试键盘的javascript程序和测试键盘的程序
    代码很简单,直接上代码:<!DOCTYPEhtml><html><head><title>Keyboardinput</title></head><body><canvasid='canvas'width='700'he......
  • Vision Transformer和MLP-Mixer联系和对比
    VisionTransformer和MLP-Mixer是深度学习领域最新的两个体系结构。他们在各种视觉任务中都非常成功。视觉VisionTransformer的性能略好于MLP-Mixers,但更复杂。但是这两个......
  • 关于 js 函数定义方式
    函数声明式function(a,b){returna+b}特点:此种方式可定义命名的函数变量,而无需给变量赋值,这是一种独立的结构,不能嵌套在非功能模块中。函数名在自身作用域和父作用域内是......
  • [数值分析]解线性方程组的迭代法
    解线性方程组的迭代法前言本文主要用两个简单的例子来介绍了解线性方程组的三种迭代法的原理和实现方法:第一个例子供我们去学习,而第二个例子供我们去验证。还另外介绍......
  • 一篇文章带你掌握主流基础框架——Spring
    一篇文章带你掌握主流基础框架——Spring这篇文章中我们将会介绍Spring的框架以及本体内容,包括核心容器,注解开发,AOP以及事务等内容那么简单说明一下Spring的必要性:Spri......
  • 上周热点回顾(9.26-10.2)
    热点随笔:· .Net7内容汇总(3)--反射优化 (jvx)· 在WPF中实现融合效果 (dino.c)· 【程序人生】27岁,又是一个新的起点 (猫咪大王_lkb)· 可恶,又是个线上问题 (艾......
  • HTML5的新增特性
    HTML5的新增特性1.HTML5新增的语义化标签header:头部标签nav:导航标签article:内容标签section:定义文档某个区域aside:侧边栏标签footer:尾部标签注意:1.这种语......
  • RxJS 系列 – Join Operators
    前言前几篇介绍过了 CreationOperatorsFilterOperatorsJoinCreationOperatorsErrorHandlingOperatorsTransformationOperators这篇继续介绍JoinOperators......
  • AWS SAA summary-Exam 02
    4EC24.1EC2conceptAmazonElasticComputeCloud(AmazonEC2)是一种Web服务,在云中提供大小可调的计算容量。该服务旨在让开发人员能更轻松地进行Web级的计算。All......