Java 中不重复字符的最长子串长度2024年9月10日 | 11 分钟阅读 发现无重复字符的最长子串的长度是一项在算法编程中至关重要的挑战。该问题涉及识别给定字符串中每个字符仅出现一次的连续部分的 the 长度。在 Java 编程环境中解决此挑战需要熟练运用字符串操作工具和算法范例。该问题在优化计算过程方面非常实用,尤其是在数据压缩和字符串处理场景中。 示例 1 输入: "pqrstuvwxy" 输出 10 解释: 整个字符串 "pqrstuvwxy" 没有重复字符,构成最长的子串,长度为 10。 示例 2 输入: "abacabadabacaba" 输出 4 解释: 无重复字符的不同的子串是 "abac" 和 "bacab",长度为 4。 示例 3 输入: "xyzxyzabcd" 输出 6 解释: 无重复字符的最长子串是 "xyzabc" 和 "yzabcd",长度均为 6。 示例 4 输入: "mississippi" 输出 4 解释: 无重复字符的最长子串是 "issi",长度为 4。 方法:使用滑动窗口,时间复杂度 O(n3)。滑动窗口方法用于在 O(n3) 时间内查找最长无重复字符子串的长度,它通过在文本中移动窗口来检查子串。 算法步骤 1: 将输入字符串 s 的长度设为 n,将 maxLength 设为 0。 步骤 2: 使用索引为 i 从 0 到 n 的循环遍历子串的所有可能起始索引。
步骤 3: allUnique 方法使用两个嵌套循环遍历子串,将每个字符与其他所有字符进行比较。 步骤 4: 如果找到重复字符,则返回 false;否则返回 true。 步骤 5: 如果子串是唯一的(allUnique 返回 true),则计算子串的长度 (j - i) 并使用其当前值和计算出的长度的最大值来更新 maxLength。 步骤 6: 两个循环完成后,返回 maxLength 的最终值,即最长无重复字符子串的长度。 步骤 7: 检查给定子串(从索引 start 到 end - 1)中的所有字符是否唯一。
步骤 8: 显示代码结果。 实施文件名: LongestSubstring1.java 输出 Length of the longest substring without repeating characters: 7 时间复杂度: 所提供代码的时间复杂度为 O(n3),其中 'n' 是输入字符串的长度。 辅助空间: 辅助空间复杂度为 O(1) 或常数空间。此外,辅助方法 allUnique 只使用少量局部变量,并且其空间复杂度与输入大小无关,始终保持常数。 方法:使用滑动窗口,时间复杂度 O(n2)滑动窗口方法用于在 O(n2) 时间内查找最长无重复字符子串的长度,它会有效地调整输入字符串上的窗口,适用于中等规模的输入。 算法步骤 1: 导入必要的包:导入 java.io.* 用于输入/输出功能,并导入 java.util.*。 步骤 2: 定义 lengthOfLongestSubstring 方法,以及 String s 的输入和 Integer 的输出(最长无重复字符子串的长度) 步骤 3: 现在初始化变量。将输入字符串 s 的长度设为 n,并将 maxLength 设为 0。 步骤 4: 开始一个索引为 i 从 0 到 n - 1 的循环。
步骤 5: 创建一个大小为 256 的布尔数组 visited,用于使用 ASCII 值跟踪已访问的字符。 步骤 6: 对于索引 j 处的每个字符
步骤 7: 如果子串是唯一的(没有重复字符),则计算子串的长度 (j - i + 1)。 步骤 8: 使用其当前值和计算出的长度的最大值来更新 maxLength。 实施文件名: LongestSubstring2.java 输出 Length of the longest substring without repeating characters: 7 时间复杂度: 所提供代码的时间复杂度为 O(n2),其中 'n' 是输入字符串的长度。这是因为代码使用了嵌套循环。外层循环运行 'n' 次,对于外层循环的每次迭代,内层循环最多运行 'n' 次。 辅助空间: 辅助空间复杂度为 O(1) 或常数空间。 方法:使用二分查找 顶部二分查找方法就像一种在有序列表中查找事物的智能方法。在查找最长无重复字符子串的长度时,它可以帮助更快地搜索最佳长度。 算法步骤 1: 初始化代码中的变量。将输入字符串 s 的长度设为 n,并将变量 low 设为 1,high 设为 n,result 设为 0。 步骤 2: 当 low 小于或等于 high 时,执行以下操作
步骤 3: 初始化一个空集 set,用于跟踪当前窗口中的字符。
步骤 4: 当当前 end 处的字符违反唯一性(存在于 set 中)时
步骤 5: 将当前字符添加到 set 中。
步骤 6: 如果存在长度为 mid 的子串且无重复字符(isValid 返回 true),则执行以下操作
步骤 7: 如果不存在长度为 mid 的子串,则执行以下操作
步骤 8: 二分查找完成后,返回 result 的最终值,即最长无重复字符子串的长度。 实施文件名: BinarySearchLongestSubstring.java 输出 Length of the longest substring without repeating characters: 7 时间复杂度: 代码的时间复杂度为 O(n log n),其中 "n" 是输入字符串的长度。 辅助空间: 辅助空间复杂度为 O(n),其中 "n" 是输入字符串的长度。 方法:使用滑动窗口通过使用滑动窗口方法,我们可以有效地探索不同的子串来找到最长的无重复字符的子串。 算法步骤 1: 如果输入字符串长度为 0,则返回 0(没有字符需要处理)。
步骤 2: 初始化最大长度 (maxLength) 为 0。
步骤 3: 初始化两个指针 leftPointer 和 rightPointer,都设为 0。
步骤 4: 如果 rightPointer 处的字符已被访问
步骤 5: 变量 maxLength 现在存储了最长无重复字符子串的长度。 步骤 6: 显示结果。 实施文件名: SlidingWindowLongestSubstring.java 输出 Given Input String: javatpoint Length of the Longest Substring without repeating characters: 7 时间复杂度: 所提供代码的时间复杂度为 O(N),其中 N 是输入字符串的长度。 辅助空间复杂度: 辅助空间复杂度为 O(1),因为使用的额外空间与输入大小无关。 方法:存储每个字符的最后索引索引存储方法涉及跟踪文本中每个字符出现的最后索引。这有助于有效地确定最长无重复字符子串的长度。 算法步骤 1: 将输入字符串 s 的长度初始化为 n。 步骤 2: 创建一个大小为 256 的数组 lastIndex,用于存储每个字符的最后索引,所有字符都初始化为 -1。
步骤 3: 开始使用滑动窗口方法遍历输入字符串的字符。 步骤 4: 将 end 指针设置为初始位置,从 0 开始并向输入字符串的末尾 (n-1) 移动。 步骤 5: 对于在当前 end 索引处遇到的每个字符:检查字符是否已存在
步骤 6: 如果当前子串中已存在该字符
步骤 7: 将当前字符的 lastIndex 更新为 end 索引。
步骤 8: 通过将其与当前子串的长度进行比较来更新 maxLength:这确保了 maxLength 始终存储最长无重复字符子串的长度。 步骤 9: 迭代完成后,返回 maxLength 的最终值,即最长无重复字符子串的长度。 实施文件名: LastIndexLongestSubstring.java 输出 Length of the longest substring without repeating characters: 7 时间复杂度: 所提供代码的时间复杂度为 O(n),其中 'n' 是输入字符串的长度。 辅助空间: 辅助空间复杂度为 O(1)。 下一个主题Java 内部类的优点 |
Java 是一种通用且广泛使用的编程语言,以其平台独立性和面向对象的方法而闻名。Java 编程中的基本概念之一是类和对象的使用。这其中一个关键方面是“驱动类”的概念。在此...
阅读 2 分钟
java.util.Date 类做什么?Java 中的 java.util.Date 类提供日期和时间。如果我们导入 java.util,可能会很有好处。如果我们想在代码中实现这些类,请使用 Java.util.Date 类。此类提供的构造函数和方法允许……
5 分钟阅读
Java 和 .NET 是用于构建各种应用程序的两个最主要的开发平台。两者都有其优点,并根据项目的具体需求进行选择。以下是 Java 和 .NET 的详细比较。Java 和 .NET 概述...
阅读 4 分钟
错误本身的名称表明这是一个内存不足错误,当 JVM 无法在堆内存中分配对象时会抛出此类错误。因此,在本节中,我们将讨论 Java.lang.outofmemory 错误、堆空间以及如何...
7 分钟阅读
Java 中的 CollationElementIterator ious() 方法及示例 java.text.CollationElementIterator 具有 ious() 函数。可以使用 CollationElementIterator 类获取前面的 Collator 元素。该方法返回前一个元素的值并将其迭代器前进到该元素。语法:public int ious() 参数:无参数可...
阅读 3 分钟
Java 中的 Duration 类中的 minusMinutes(long minutes) 方法用于从 Duration 实例中减去所需的分钟数。Duration 类是 java.util 包中的类之一。它是一个基于时间的特征,在 Java 8 中添加...
阅读9分钟
Java 是一种广受好评的编程语言,以其强大的面向对象设计而著称。使 Java 与众不同的一项不可或缺的组件是它对静态方法的利用。这些重要的工具使开发人员能够创建实用函数、访问类级别的变量并优化代码执行。贯穿...
阅读 4 分钟
有向图的传递闭包是一个可达性矩阵,显示任意两个顶点之间是否存在路径。当从顶点 u 到顶点 v 存在路径时,闭包将设置 reach[u][v] = 1;否则,reach[u][v] = 0。传递闭包...
阅读 6 分钟
在本节中,我们将学习关于控制台的所有知识,即什么是控制台,我们如何使用控制台,我们如何实现控制台输出,我们如何使用控制台输入等等。什么是控制台?要运行程序,我们可能需要...
18 分钟阅读
在本节中,我们将学习如何创建一个 Java 程序来查找三个数字中的最小者。除此之外,我们还将学习如何使用三元运算符在 Java 中查找三个数字中的最小者。使用三元运算符 在进入程序之前……
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India