2337。移动棋子获得字符串
难度:中等
主题: 两个指针,字符串
给定两个字符串 start 和 target,长度均为 n。每个字符串仅包含字符“L”、“R”和“_”,其中:
- 字符'L'和'R'代表棋子,其中棋子'L'只有在其左侧直接有空白空间时才能移动到左侧,只有当有空白空间直接移动到右时,棋子'R'才能移动到 右
- 没错。 字符“_”代表一个空格,可以被 任意
如果可以通过移动字符串 start 的各个部分来获取字符串目标,则返回
true。否则,返回 false.
示例1:- 输入:开始=“LR R
- ”,目标=“L______RR” 输出:
- true
- 说明:
- 我们可以通过执行以下操作从头开始获取字符串目标: 将第一块向左移动一步,start 变为等于“L__R R
- ”。 将最后一块向右移动一步,start 变为等于“L_ R
- _R”。
- 将第二个棋子向右移动三步,start 变为等于“L______RR”。
示例2:
- 输入:
- start = "R_L_", target = "__LR" 输出:
- false
说明:字符串开头的‘R’部分可以向右移动一步,得到“R
- L
- ”。
示例 3:
- 输入: start = " R", target = "R
- " 输出:
- false 输出:
约束:
- n == start.length == target.length 1 5
提示:
- 经过一系列的移动后,棋子的顺序可以改变吗?
解决方案:
我们需要检查是否可以通过按照给定规则移动棋子(“L”和“R”)将字符串开头转换为字符串目标。需要考虑的主要限制是:
- ‘L’只能向左移动(不能与其他‘L’或‘R’棋子交叉)。
- 'R'只能向右移动(不能越过其他'L'或'R'棋子)。
- 我们可以使用任何空格('_')来移动棋子。
计划:
长度检查:首先,检查两个字符串的长度是否相同。如果没有,立即返回 false。
字符频率检查:起始字符串中“L”、“R”和“_”的数量必须与目标字符串中各自的计数相匹配,因为这些片段无法重复或销毁,只是感动。
-
使用两个指针进行棋子匹配:
- 遍历两个字符串(开始和目标)。
- 检查开始中的每个棋子(“L”或“R”)是否可以移动到目标中相应的位置。
- 具体:
- “L”应该始终向左移动(即,它不能处于目标中的棋子应该向右移动的位置)。
- “R”应始终向右移动(即,它不能位于目标中的棋子应向左移动的位置)。
算法说明:
-
过滤左右位置:
- 将字符串start和target中的所有_去掉,比较L和R的序列。如果序列不同,立即返回false。
-
双指针遍历:
- 使用两个指针迭代start和target中的字符。
- 确保:
- 对于L,start中的棋子只能向左移动,所以它在start中的位置应该大于或等于它在target中的位置。
- 对于 R,start 中的棋子只能向右移动,因此它在 start 中的位置应该小于或等于它在 target 中的位置。
-
输出结果:
- 遍历时如果所有条件都满足,则返回true。否则,返回 false。
让我们用 PHP 实现这个解决方案:2337。移动棋子得到字符串
<?php /** * @param String $start * @param String $target * @return Boolean */ function canChange($start, $target) { ... ... ... /** * go to ./solution.php */ } // Test cases var_dump(canChange("_L__R__R_", "L______RR")); // true var_dump(canChange("R_L_", "__LR")); // false var_dump(canChange("_R", "R_")); // false ?>
解释:
初始检查:首先,我们检查两个字符串的长度,并确保两个字符串中“L”和“R”的计数相同。如果不是,则返回 false。
-
双指针逻辑:我们使用两个指针i和j来遍历两个字符串:
- 跳过空格('_'),因为它们不会影响棋子的移动。
- 如果 start 和 target 中 i 和 j 处的字符不同,则返回 false(因为我们无法将棋子移动到不同的字符)。
- 如果在 start 中找到“L”并且其位置大于其目标位置,或者如果在 start 中找到“R”且其位置小于其目标位置,则返回 false(因为 'L ' 只能向左移动,'R' 只能向右移动)。
-
边缘情况:解决方案处理所有可能的边缘情况,例如:
- 开始和目标中“L”或“R”的计数不同。
- 由于限制而无法移动棋子。
时间复杂度:
- 时间复杂度为 O(n),其中 n 是输入字符串的长度。这是因为我们只遍历每个字符串一次。
空间复杂度:
- 空间复杂度为 O(1),因为我们只使用固定数量的额外空间。
复杂度分析:
-
时间复杂度:
- 过滤下划线需要O(n).
- 两指针遍历需要O(n).
- 总体:O(n)。
-
空间复杂度:
- 创建两个字符串($startNoUnderscore 和 $targetNoUnderscore),每个字符串的大小 O(n).
- 总体:O(n)。
测试用例说明:
-
输入: _L__R__R_,L______RR
- L 和 R 匹配的顺序。
- 每个棋子都可以按照规则移动到需要的位置。
- 输出: true。
-
输入: R_L_, __LR
- L 和 R 匹配的顺序。
- R棋子不能向左移动;因此,转变是不可能的。
- 输出: false。
-
输入: _R, R_
- R棋子不能向左移动;因此,转变是不可能的。
- 输出: false。
此实现非常高效,并且遵循问题约束,使其适合大输入量。
联系链接
如果您发现本系列有帮助,请考虑在 GitHub 上给 存储库 一个星号或在您最喜欢的社交网络上分享该帖子?。您的支持对我来说意义重大!
如果您想要更多类似的有用内容,请随时关注我:
- 领英
- GitHub
以上是移动棋子以获得字符串的详细内容。更多信息请关注PHP中文网其他相关文章!

PHP在现代编程中仍然是一个强大且广泛使用的工具,尤其在web开发领域。1)PHP易用且与数据库集成无缝,是许多开发者的首选。2)它支持动态内容生成和面向对象编程,适合快速创建和维护网站。3)PHP的性能可以通过缓存和优化数据库查询来提升,其广泛的社区和丰富生态系统使其在当今技术栈中仍具重要地位。

在PHP中,弱引用是通过WeakReference类实现的,不会阻止垃圾回收器回收对象。弱引用适用于缓存系统和事件监听器等场景,需注意其不能保证对象存活,且垃圾回收可能延迟。

\_\_invoke方法允许对象像函数一样被调用。1.定义\_\_invoke方法使对象可被调用。2.使用$obj(...)语法时,PHP会执行\_\_invoke方法。3.适用于日志记录和计算器等场景,提高代码灵活性和可读性。

Fibers在PHP8.1中引入,提升了并发处理能力。1)Fibers是一种轻量级的并发模型,类似于协程。2)它们允许开发者手动控制任务的执行流,适合处理I/O密集型任务。3)使用Fibers可以编写更高效、响应性更强的代码。

PHP社区提供了丰富的资源和支持,帮助开发者成长。1)资源包括官方文档、教程、博客和开源项目如Laravel和Symfony。2)支持可以通过StackOverflow、Reddit和Slack频道获得。3)开发动态可以通过关注RFC了解。4)融入社区可以通过积极参与、贡献代码和学习分享来实现。

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

PHP不是在消亡,而是在不断适应和进化。1)PHP从1994年起经历多次版本迭代,适应新技术趋势。2)目前广泛应用于电子商务、内容管理系统等领域。3)PHP8引入JIT编译器等功能,提升性能和现代化。4)使用OPcache和遵循PSR-12标准可优化性能和代码质量。

PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SublimeText3 Linux新版
SublimeText3 Linux最新版

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

Atom编辑器mac版下载
最流行的的开源编辑器

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。