Java 中的最小后缀翻转2025 年 1 月 7 日 | 阅读 9 分钟 寻找最小后缀翻转的问题涉及处理两个二进制字符串:初始字符串 s 和目标字符串 target。这里,两个字符串的长度均为 n,初始字符串 s 是一个全零字符串(即 s = "000. .. 0")。目标是在最少的翻转操作次数内,将字符串 s 转换为目标字符串。 示例 1 输入 输出 Minimum operations needed: 3 解释 示例 2 输入 输出 Minimum operations needed: 3 解释 方法 1:使用递归递归方法的核心思想是使用递归来处理转换。在每一步,我们检查当前字符是否与(基于迄今为止的翻转次数)预期的字符匹配。如果不匹配,我们执行翻转并进行递归调用来处理字符串的其余部分。 算法步骤 1:定义 minOperations 方法,该方法使用初始索引 0 和 flipped 设置为 false 调用 helper 方法 minOperationsHelper。 步骤 2:minOperationsHelper 方法检查索引是否已到达字符串末尾。如果是,则返回 0,因为不再需要更多操作。 步骤 3:根据翻转状态确定当前索引处的预期字符(如果 flipped 为 true 则为“1”,否则为“0”)。 步骤 4:字符比较:如果 target 中的当前字符与预期字符不匹配,则意味着需要翻转:将操作计数增加 1。使用下一个索引和切换的翻转状态进行递归调用。 步骤 5:如果字符匹配,则无需翻转:使用下一个索引进行递归调用,而不更改翻转状态。 文件名:MinimumSuffixFlips.java 输出 Minimum operations needed: 3 时间复杂度整体时间复杂度为 O(n),其中 n 是目标字符串的长度。递归处理字符串中的每个字符一次。 空间复杂度整体空间复杂度为 O(n),因为递归调用堆栈,在最坏情况下,该堆栈的深度可能与字符串的长度一样大。 方法 2:使用栈使用栈的方法的核心思想是跟踪目标字符串中位值从“0”变为“1”或从“1”变为“0”的过渡点。每次过渡都代表了一个需要进行翻转的点。通过将目标字符串的字符压入栈并计算变化次数,我们可以确定所需的翻转次数。 算法步骤 1:初始化:创建一个空栈来跟踪目标字符串中的过渡。初始化一个操作计数器为 0,该计数器将跟踪所需翻转操作的数量。 步骤 2:遍历目标字符串:使用 for 循环遍历目标字符串中的每个字符。对于每个字符,检查栈是否为空,或者栈顶元素是否与当前字符不同。 步骤 3:如果任一条件为真,则将当前字符压入栈并增加操作计数器,这表示需要翻转的新段。 步骤 4:操作计数器将包含将 s 转换为 target 所需的最少翻转操作次数,然后返回最小翻转次数。 文件名:MinimumSuffixFlips1.java 输出 Minimum operations needed: 3 时间复杂度基于栈的方法的时间复杂度为 O(n),其中 n 是目标字符串的长度。该算法只遍历目标字符串一次。目标字符串中的每个字符都以恒定时间处理。 空间复杂度基于栈的方法的空间复杂度为 O(n)。在最坏情况下,如果每个字符都与其前一个字符不同,栈可以容纳目标字符串的所有字符。因此,栈使用的空间与目标字符串的长度呈线性增长。 方法 3:直接过渡计数使用直接过渡计数方法可以有效地解决将初始二进制字符串 s(全零)转换为目标二进制字符串 target 的问题,其中需要最少数量的翻转操作。 算法步骤 1:首先将操作计数器设置为 0,它跟踪执行的翻转操作的数量。初始化一个变量 currentBit 为“0”,表示字符串 s 中位的初始状态。 步骤 2:遍历目标字符串:循环遍历目标字符串 target 中的每个字符。对于每个字符,将其与 currentBit 进行比较。 步骤 3:如果 target 中的当前字符与 currentBit 不同,则意味着发生了过渡 步骤 3.1:将操作计数器加 1。将 currentBit 更新为 target 中的当前字符。 步骤 4:遍历完整个目标字符串后,操作计数器将包含将 s 转换为 target 所需的最少翻转次数。 文件名:MinimumSuffixFlips2.java 输出 Minimum operations needed: 3 时间复杂度直接过渡计数方法的时间复杂度为 O(n),其中 n 是目标字符串的长度。这是因为算法只遍历目标字符串一次。 空间复杂度直接过渡计数方法的空间复杂度为 O(1)。该算法使用的额外空间量恒定,与输入大小无关。只有少数变量(operations、currentBit)用于跟踪当前状态和操作计数。 方法 4:贪心翻转计数贪心翻转计数是一种简单的方法,用于确定将初始二进制字符串 s(最初全零)转换为目标二进制字符串 target 所需的最少翻转操作次数。此方法依赖于贪心策略直接计数过渡,从而得到一种有效的解决方案。 算法步骤 1:将操作计数器设置为 0,以计算所需的翻转操作次数。首先比较目标字符串中的每一位与其前一位,以检测变化。 步骤 2:遍历目标字符串:对于每个字符,将其与前一个字符(或第一个字符的“0”)进行比较。 步骤 3:每当当前字符与前一个字符不同时,就增加操作计数器,因为它表示需要翻转操作才能匹配字符串的该段。 步骤 4:处理完整个字符串后,返回操作计数器,该计数器现在包含所需的最少翻转次数。 文件名:MinimumSuffixFlips3.java 输出 Minimum operations needed: 3 时间复杂度贪心翻转计数方法的时间复杂度为 O(n),其中 n 是目标字符串的长度。该算法只遍历目标字符串一次。目标字符串中的每个字符都以恒定时间处理。 空间复杂度贪心翻转计数方法ii 的空间复杂度为 O(1)。该算法使用的额外空间量恒定,与输入大小无关。只有少数变量(operations)用于跟踪翻转操作的数量。 方法 5:双指针技术双指针技术提供了一种有效的方法来解决将初始二进制字符串 s(全零)转换为目标二进制字符串 target 的问题。此技术使用两个指针来跟踪目标字符串中的过渡并计算需要翻转的段数。 算法步骤 1:初始化两个指针,current 和 next。将 current 指针设置为 target 字符串的第一个字符。将 next 指针设置为第二个字符。初始化操作计数器为 0。 步骤 2:遍历目标字符串:使用 next 指针遍历目标字符串。将 next 指针处的字符与 current 指针处的字符进行比较。 步骤 3:每当 next 指针处的字符与 current 指针处的字符不同时,就表示发生了过渡 步骤 3.1:增加操作计数器。将 current 指针移到 next 指针。继续此过程直到字符串末尾。 步骤 4:操作计数器将包含将 s 转换为 target 所需的最少翻转次数,然后返回结果。 文件名:MinimumSuffixFlips4.java 输出 Minimum operations needed: 3 时间复杂度双指针技术的时间复杂度为 O(n),其中 n 是目标字符串的长度。这是因为算法只遍历目标字符串一次。 空间复杂度双指针技术ii 的空间复杂度为 O(1)。该算法使用的额外空间量恒定,与输入大小无关。 结论总之,最小后缀翻转问题可以通过各种方法来解决,每种方法在可读性、效率和空间利用率方面都有其优点。方法的选择可以取决于具体的约束和偏好。 |
Java 是一种通用且广泛使用的编程语言,它提供了多种支持多态的特性。多态是面向对象设计中的一个关键概念,它允许我们轻松方便地编写与不同对象协同工作的代码。Java 中的名义多态性是一个重要的...
阅读 4 分钟
在一个系统中,有两个单链表。由于某种错误,其中一个链表的最后一个节点链接到了第二个链表。因此创建了一个 Y 形链表。我们的任务是找出给定...
阅读 13 分钟
给定一个非负整数数组,其中每个数字出现的次数都是偶数,只有一个数字出现的次数是奇数。任务是找出出现次数是奇数的那个数字。例如:输入:a[] = {7,...
阅读9分钟
在 Java 中,程序包含类和方法。此外,方法包含执行特定操作所需的表达式和语句。这些语句和表达式由令牌组成。换句话说,我们可以说表达式和语句是一个集...
阅读 4 分钟
在 Java 中,有多种方法可以计算电费。我们可以使用静态值、命令行参数、方法和函数、用户定义方法以及 do-while 和 for 循环来计算电费。让我们一一了解它们:使用静态方法在这种情况下...
5 分钟阅读
Java 中的类型转换是开发人员将一种数据类型转换为另一种数据类型的基本概念。它对于在各种情况下处理数据至关重要,尤其是在处理不同类型的变量、表达式和方法时。在 Java 中,类型转换是...
阅读 6 分钟
Java 编程被世界各地的许多用户使用。它提供了许多用于解决不同问题的包。要在我们的程序中使用 Java 包,需要使用 import 关键字。在本节中,我们将讨论 Java 中的静态导入。Java import 关键字大多数 Java 程序都以……开始。
5 分钟阅读
在 Java 8 的函数式编程领域,map() 和 flatMap() 操作是 Stream API 的基本组成部分。这两个方法虽然名称相似,但作用截然不同,理解它们的区别对于编写简洁、富有表现力和高效的代码至关重要。在...
5 分钟阅读
Java 提供了两种类型的数据类型:原始数据类型和引用数据类型。原始数据类型在 Java 中是预定义的,作为构建块;而引用数据类型则指向存储数据的位置。在本节中,我们将讨论什么是...
阅读 3 分钟
Java 是一种多功能且流行的编程语言,提供了广泛的工具和数据结构来帮助开发人员创建高效、可靠且线程安全的应用程序。Java 并发框架中的一个此类工具是 Atomic Boolean。在本节中,我们将探讨什么是 Atomic...
阅读 16 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India