Check if DFS Strings are Palindromes in Java2025 年 5 月 12 日 | 阅读 9 分钟 可以使用图或树结构进行深度优先搜索 (DFS) 遍历,以检查沿路径累积的字符串是否构成回文。回文是指正反读起来都相同的序列。 应用 DFS 可以让我们构建字符串,检查每条路径,并使用字符串反转或双指针技术来确认字符串的对称性。这种方法对于涉及字母序列、单词图或树路径的问题尤其有效。 它适用于输入限制稍大的情况,因为其效率取决于深度和分支因子。通过及早消除非回文路径,剪枝等优化可以提高效率。 给定一个以节点 0 为根的树,包含 n 个节点,编号从 0 到 n - 1。一个大小为 n 的数组用于表示树,其中 parent[i] 是节点 i 的父节点。已知节点 0 是根,parent[0] == -1。此外,我们还提供了一个长度为 n 的字符串 s,其中分配给节点 i 的字符是 s[i]。 我们的任务是找到一个大小为 n 的布尔数组,如果生成的字符串 dfsStr 是回文,则返回 "true";否则返回 false。 示例 1 输入 int parent[] = [-1, 0, 0, 0, 0] String str = "aabcb" 输出:[true, true, true, true, true] 解释 parent 等于 [-1, 0, 0, 0, 0] 表示树的结构
要确定是否形成了回文,请从根节点到每个节点构建一个字符串
由于每条路径都形成回文,因此输出为 [true, true, true, true, true]。 示例 2 输入 int parent[] = [-1, 0, 0, 1, 1, 2], String str = "aababa" 输出:[true, true, false, true, true, true] 解释 parent 等于 [-1, 0, 0, 1, 1, 2] 表示树的结构
分配给每个节点的字符由 s = "aababa" 表示。 要确定是否形成了回文,请从根节点到每个节点构建一个字符串
由于节点 0、1、3、4 和 5 的路径是回文,但节点 2 不是,因此输出为 [true, true, false, true, true, true]。 方法:使用递归正向和反向哈希使用滚动哈希和深度优先搜索 (DFS) 方法,提供的 Java 程序有效地确定树结构中的每个子树是否生成回文文本。 一个父数组,其中每个节点包含其子节点,用于构建树。在模运算中使用素数基 31 和模数 1,000,000,007 来提供快速且可靠的哈希计算。 为了使多项式哈希计算更有效,程序预先计算幂值。在 DFS 遍历期间,通过考虑子节点的哈希来计算每个节点的前向哈希和反向哈希。 回文是具有匹配的正向和反向哈希的子树字符串。该解决方案可以处理复杂的分层数据结构,因为它有效地处理大树而无需不必要的字符串操作。显示回文子树的布尔数组是程序的最终输出。 算法步骤 1:声明常量 PRIME = 31(用于滚动哈希计算)和 MODULUS = 1,000,000,007(大素数以避免溢出)。 步骤 2:计算 powers[i] = (powers[i-1] * PRIME) 的百分比。为了进行有效的多项式哈希计算,请使用 MODULUS。 步骤 3:验证这是否只计算一次。 步骤 4:将输入字符串读取为字节数组,并将父数组。 步骤 5:初始化 child[][], LENGTH[], hash[], reverseHash[] 数组。 步骤 6:计算 childCount[] 以获取每个节点的子节点数。 步骤 7:从根节点 (0) 开始 DFS;对每个节点执行。 步骤 7.1:递归计算子节点的哈希。 步骤 7.2:计算正向哈希和反向哈希。 步骤 7.3:使用子树的整个字符串长度更新 LENGTH[node]。 步骤 8:通过从下往上遍历节点来识别回文子树。 步骤 8.1:如果 hash[i] == reverseHash[i],则将 result[i] 标记为 true。 步骤 9:如果结果为 true,则以该节点为根的子树形成回文。返回 boolean[]。 实施输出 [true, true, false, true, true, true] 复杂度分析上述代码的时间复杂度为 O(N),其中 'N' 表示数组的长度,空间复杂度为 O(N)。 方法:使用 Manacher 算法为了最大化回文子串的识别,此 Java 应用程序结合了基于邻接表的树表示、DFS 遍历和 Manacher 技术。它计算入出时间,存储节点访问顺序,并使用 DFS 有效地处理树节点。 借助 Manacher 方法(使用修改后的字符串格式围绕中心扩展),DFS 生成的字符串可以实现线性时间的回文测试。基于数组的索引可最大程度地减少不必要的计算并优化查找过程。 对于回文识别,该技术保证了 O(n) 的总时间复杂度,这使其非常高效。通过使用预计算的回文长度的逻辑条件来确定每个节点的子串有效性。 算法步骤 1:创建一个 DFS 遍历字符串 (dfsString),一个用于入场时间 (inT) 的数组,以及一个用于出场时间 (outT) 的数组。 步骤 2:在索引中维护 DFS 字符的跟踪。 步骤 3:为了表示树结构,请使用邻接列表 (arr_list)。 步骤 4:在 DFS 遍历中,准备 nodeString[][] 来存储每个节点的开始和结束索引。 步骤 5:使用 parent[] 数组进行迭代。 步骤 6:为了表示树,请填充邻接列表 (arr_list)。 步骤 7:从根节点 0 开始 DFS。 步骤 8:首次访问节点时,记录入场时间。 步骤 9:递归访问每个子节点。 步骤 10:处理完每个子节点后,保存出场时间。 步骤 11:按 DFS 顺序将节点字符附加到 dfsString[]。 步骤 12:为了实现一致的回文扩展,通过在字符之间插入 # 来转换 DFS 字符串。 步骤 13:初始化数组 p[] 以存储回文的长度。 步骤 14:扩展回文的中心并更新左右边界 (l) 和 (r)。 步骤 15:确定每个位置可能的最长回文长度。 步骤 16:使用 nodeString[][] 获取每个节点的子串索引。 步骤 17:计算子串的中心以及它之间的匹配回文边界。 步骤 18:确定回文是否比节点的子串长,并将结果记录为 true 或 false。 实施输出 [true, true, false, true, true, true] 复杂度分析上述代码的时间复杂度为 O(N),其中 "N" 表示数组的长度,空间复杂度为 O(N)。 下一主题Java 中的序数 |
Codility 的 Passing Cars 问题只是众多典型算法问题之一,其主要目标是确定在同一条道路上朝相反方向行驶的有效成对汽车的总数。更具体地说,问题要求计算...
阅读 4 分钟
如果可以将一个数 N 的所有因子划分为两个集合,使得第一个集合中数字(因子)的总和等于第二个集合中数字(因子)的总和,则称该数 N 为 Zumkeller 数。...
11 分钟阅读
目标是按垂直之字形遍历顺序获得二叉树中各节点的值。树的垂直之字形遍历描述如下:按从右到左的顺序列出第一层的元素;如果没有剩余部分,则移动...
阅读 6 分钟
在 Java 中将两个字符串相乘涉及将表示数字的字符串转换为整数值,执行乘法,然后将结果转换回字符串。当处理超出 int 等基本数据类型范围的非常大的数字时,这种方法特别有用...
阅读9分钟
? Java Calendar 类 (java.util.Calendar) 是一个非常有用的实用类,用于在 Java 中操作日期和时间。在这里,我将向您展示如何使用 Calendar 类更改日期和时间。使用 Calendar() 类方法获取今天的日期和时间。DateFormat dF = new...
阅读 4 分钟
? 在本节中,我们将学习将字节转换为十六进制的各种方法。将字节转换为十六进制以下是将字节转换为十六进制的方法:使用 Integer.toHexString() 方法使用 String.format() 方法使用字节操作使用 Integer.toHexString() 方法它是 java.lang.Integer 类的内置函数。语法:public static String toHexString(int...
阅读 3 分钟
在二叉树中,显示奇数层节点(任意顺序)。假设根节点位于第 1 层。对于下面的二叉树:奇数层节点为:20 25 3 5 7。由于我们必须以任意顺序显示节点。因此,20 25 5……
阅读 4 分钟
在 Java 中,有多种交换两个数字的方法。通常,我们使用 Math 类的 swap() 方法,或者使用第三个(临时)变量来交换两个数字。除了这两种方法,我们还可以使用按位运算符(XOR)和...来交换两个数字。
阅读 3 分钟
在普通对话中,艺术意味着装裱好的画作;在这种情况下,有些人认为艺术只属于知识分子或艺术爱好者。尽管如此,艺术是为每个人准备的,也是为任何想体验它的人准备的,而且它通常比我们意识到的存在于更多的地方。它...
阅读 6 分钟
Java 编程中有像 if-else 这样的条件语句来表示程序中的不同条件。但是,当条件数量更多时,使用 if-else 语句并不合适。为了解决这个问题,Java 编程语言支持 switch-case 语句...
阅读 6 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India