LeetCode 2337. Move Pieces to Obtain a String【字符串,双指针】1693

news/2024/10/29 3:37:58/

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

给你两个字符串 start 和 target ,长度均为 n 。每个字符串  由字符 'L''R' 和 '_' 组成,其中:

  • 字符 'L' 和 'R' 表示片段,其中片段 'L' 只有在其左侧直接存在一个 空位 时才能向  移动,而片段 'R' 只有在其右侧直接存在一个 空位 时才能向  移动。
  • 字符 '_' 表示可以被 任意 'L' 或 'R' 片段占据的空位。

如果在移动字符串 start 中的片段任意次之后可以得到字符串 target ,返回 true ;否则,返回 false 。

示例 1:

输入:start = "_L__R__R_", target = "L______RR"
输出:true
解释:可以从字符串 start 获得 target ,需要进行下面的移动:
- 将第一个片段向左移动一步,字符串现在变为 "L___R__R_" 。
- 将最后一个片段向右移动一步,字符串现在变为 "L___R___R" 。
- 将第二个片段向右移动三步,字符串现在变为 "L______RR" 。
可以从字符串 start 得到 target ,所以返回 true 。

示例 2:

输入:start = "R_L_", target = "__LR"
输出:false
解释:字符串 start 中的 'R' 片段可以向右移动一步得到 "_RL_" 。
但是,在这一步之后,不存在可以移动的片段,所以无法从字符串 start 得到 target 。

示例 3:

输入:start = "_R", target = "R_"
输出:false
解释:字符串 start 中的片段只能向右移动,所以无法从字符串 start 得到 target 。

提示:

  • n == start.length == target.length
  • 1 <= n <= 10^5
  • start 和 target 由字符 'L''R' 和 '_' 组成

解法 双指针

首先,无论怎么移动,由于 L L L R R R 无法互相穿过对方,那么去掉 _ 后的剩余字符应该是相同的,否则返回 f a l s e false false 。然后用双指针从左向右遍历 start \textit{start} start target \textit{target} target ,分类讨论:

  • 如果当前字符为 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
class Solution {
public:bool canChange(string start, string target) {int n = start.size();int i = 0;for (int j = 0; j < n; ++j) {if (target[j] == '_') continue;while (i < n && start[i] == '_') ++i;if (i == n || start[i] != target[j] || // 当前字符不同i != j && (start[i] == 'L') == (i < j)) return false; // 顺序不符合++i; }while (i < n)if (start[i++] != '_') return false;return true;}
};

复杂度分析:

  • 时间复杂度: O ( n ) \mathcal{O}(n) O(n) ,其中 n n n start \textit{start} start 的长度。
  • 空间复杂度: O ( 1 ) \mathcal{O}(1) O(1)

http://www.ppmy.cn/news/1050937.html

相关文章

前端面试:【DOM】编织网页的魔法

嘿&#xff0c;亲爱的代码魔法师&#xff01;在JavaScript的奇幻世界里&#xff0c;有一项强大的技能&#xff0c;那就是DOM操作。DOM&#xff08;文档对象模型&#xff09;操作允许你选择、修改和创建网页元素&#xff0c;就像是在编织一个魔法的网页。 1. 什么是DOM&#xff…

【Leetcode】105.从前序与中序遍历序列构造二叉树

一、题目 1、题目描述 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示例1: 输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] 输出: [3,9,20,null,null,15,7]示例…

Java学习笔记39

Java笔记39 反射机制 静态/动态语言 动态语言 是一类在运行时可以改变其结构的语言&#xff1a;例如新的函数、对象、甚至代码可以被引进&#xff0c;已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。主要动态语言&#…

开源若依+uniapp商城支持微信小程序/H5/微信支付/商品管理/订单管理/会员管理

开源若依uniapp商城介绍支持微信小程序/H5/微信支付/商品管理/订单管理/会员管理 观看建议 建议两倍速度观看&#xff01;&#xff01;&#xff01; 访问地址&#xff1a;https://mall.ichengle.top/ 源码地址&#xff1a;https://gitee.com/zccbbg/RuoYi-Mall 若依介绍 若依…

sed替换命令

用sed编辑流时&#xff0c;最强大的命令莫过于它的替换命令。它有许多参数选项&#xff0c;可以完成诸多复杂的工作。 1. 替换命令的语法 sed [address-range|pattern-range] s/original-string /replacement-string/[substitute-flags] inputfile 注意&#xff0c;上面的换…

vue element-ui 菜单管理使用图标选择器组件

目录 &#x1f31f;前言&#x1f31f;安装&#x1f31f;main.js配置&#x1f31f;页面使用&#x1f31f;效果展示 &#x1f31f;前言 哈喽小伙伴们&#xff0c;本文为大家介绍一下 VueElementUI 中图标选择器组件的使用方法&#xff1b;一起来看下吧。 &#x1f31f;安装 np…

浙江某半导体厂房配电室电气节点无线测温方案

摘 要&#xff1a;半导体被誉为“制造业的大脑”&#xff0c;在关系国家安全和国民经济命脉的主要行业和关键领域占据支配地位&#xff0c;是国民经济的重要支柱。 随着数字技术的发展和数字经济在国民经济中所占比重越来越高&#xff0c;半导体产业的重要性还会进一步提升。安…

LLM生成式 AI 项目生命周期Generative AI project lifecycle

在本课程的其余部分中&#xff0c;您将学习开发和部署LLM驱动应用所需的技巧。在这个视频中&#xff0c;您将了解一个能帮助您完成此工作的生成式AI项目生命周期。此框架列出了从构思到启动项目所需的任务。到课程结束时&#xff0c;您应该对您需要做的重要决策、可能遇到的困难…