Java 中计算字符串中不同子串的数量2024 年 9 月 10 日 | 阅读 7 分钟 给定一个字符串 inStr。任务是计算字符串 inStr 的唯一子串的总数。输入字符串的所有字符都是小写字母。 示例 1 输入 String inStr = "abcde" 输出: 有 16 个唯一子串。 解释: 不同的子串是: "", "a", "b", "c", "d", "e", "ab", "bc", "cd", "de", "abc", "bcd", "cde", "abcd", "bcde", "abcde" 它们的数量是 16。因此,输出是 16。 示例 2 输入 String inStr = "abbcccdd" 输出: 有 32 个唯一子串。 解释: 不同的子串是: "", "a", "b", "c", "d", "ab", "bb", "bc", "cc", "cd", "dd", "abb", "bbc", "bcc", "ccc", "ccd", "cdd", "abbc", "bbcc", "bccc", "cccd", "ccdd", "abbcc", "bbccc" "bcccd", "cccdd", "abbccc", "bbcccd", "bcccdd", "abbcccd", "bbcccdd", "abbcccdd" 它们的数量是 32。因此,输出是 32。 示例 3 输入 String inStr = "aaaaaaa" 输出: 有 8 个唯一子串。 解释: 不同的子串是: "", "a", "aa", "aaa", "aaaa", "aaaaa", "aaaaaa", "aaaaaaa" 它们的数量是 8。因此,输出是 8。 方法:使用 Substring() 方法方法很简单。我们所要做的就是使用嵌套的 for 循环和 substring() 方法生成给定字符串的所有子字符串。生成的子字符串可以放入哈希集合中。因此,所有重复的子字符串都会被丢弃,因为哈希集合始终包含唯一元素。哈希集合的大小就是我们的答案。 文件名: DistinctSubArrCount.java 输出 For the string: "abcde", the total substring count is: 16 For the string: "abbcccdd", the total substring count is: 32 For the string: "aaaaaaa", the total substring count is: 8 复杂度分析: 嵌套的 for 循环需要 O(n2) 的时间来完成工作。此外,我们在内部 for 循环中调用 substring() 方法,而 substring() 方法需要 O(n) 的时间。因此,程序的总时间复杂度为 O(n3)。该程序还使用哈希集合来存储子字符串。字符串的数量最多可以达到 (n x (n + 1)) / 2,子字符串的大小最多可以达到 n。因此,程序的空间复杂度为 O(n3),其中 n 是输入字符串中存在的字符总数。 优化: 我们可以排除使用 substring() 方法来降低程序的时空复杂度。我们可以将当前字符追加到前一个子字符串以生成当前子字符串。 文件名: DistinctSubArrCount1.java 输出 For the string: "abcde", the total substring count is: 16 For the string: "abbcccdd", the total substring count is: 32 For the string: "aaaaaaa", the total substring count is: 8 复杂度分析: 该程序仅使用嵌套的 for 循环。因此,程序的时空复杂度为 O(n2)。空间复杂度与前一个程序相同。 由于较高的空间复杂度,上述程序不适合处理大型字符串。对于大型字符串,上述程序会给出 MLE (内存限制超出)。因此,需要进行一些优化来减少程序消耗的内存。 方法:使用 TRIE可以使用 TRIE 来改进空间复杂度。方法是仅将那些尚未插入的字符插入到 TRIE 中。当出现这样的字符时,意味着我们将得到唯一的子串,我们将唯一子串的数量加 1。请看下面的实现。 文件名: DistinctSubArrCount2.java 输出 For the string: "abcde", the total substring count is: 16 For the string: "abbcccdd", the total substring count is: 32 For the string: "aaaaaaa", the total substring count is: 8 复杂度分析: 程序的时间复杂度与前一个程序相同。对于每一个尚未存储在 TRIE 数据结构中的字符,我们需要分配 26 个字符的内存,这使得程序的空间复杂度为 O(26 x n),我们也可以将其写成渐近的 O(n)。 下一个主题Java 中显示整数数组的所有子集 |
Java 是一种多功能且广泛使用的编程语言,以其丰富的库和强大的功能而闻名。其中一项功能是 Icon 接口,它允许开发人员创建对象的动态图形表示。在本节中,我们将深入探讨 Java 中的 Icon 接口,...
5 分钟阅读
在 Java 中,BiFunction 是一个函数式接口。它在 Java 8 中引入。它可以用作 lambda 表达式或方法引用的赋值目标。它属于 java.util.function 包。@FunctionalInterface public interface BiFunction<T,U,R> 该接口接受三个类型参数,如下所示: T:表示第一个...
阅读 2 分钟
java.io.ObjectInputStream 类用于反序列化先前使用 ObjectOutputStream 序列化的对象和基本数据。它允许重建对象图,并确保序列化对象的类与当前 JVM(Java 虚拟机)类定义兼容。ObjectOutputStream 和 ObjectInputStream 协同工作以保存和...
阅读 22 分钟
Java 是一种非常流行的面向对象编程语言,用于创建各种应用程序。Java 编写泛型方法的能力是其最强大的特性之一。任何可用于多种对象类型的技术都称为泛型。开发人员可以设计可重用代码...
7 分钟阅读
? 在 Java 中,SSL 证书可以定义为一种数字证书,它用于在服务器和使用 SSL/TLS(安全套接层/传输层安全)协议的客户端之间提供安全、加密和连接。在各个领域...
5 分钟阅读
LinkedList(链表)是计算机科学中的基本数据结构,它提供动态存储分配和灵活性。它由通过指针连接的节点组成,每个节点包含数据和指向下一个节点的引用。在本文中,我们将探讨比较两个链表的各种方法……
11 分钟阅读
在 Java 中,颜色在创建视觉上吸引人且交互式应用程序方面发挥着至关重要的作用。无论您是开发游戏、图形用户界面 (GUI) 还是数据可视化,理解如何使用颜色都是必不可少的。在 Java 中,Color 类提供了一种强大而灵活的方式...
5 分钟阅读
按位补码运算符属于一元运算符(只处理一个操作数)的类别。它接收一个数字并反转其所有位。当对位应用按位运算符时,1会变成0,0会变成1...
阅读 3 分钟
在软件开发领域,文本处理是一项常见任务。无论您是构建搜索引擎、聊天机器人,还是任何处理文本的应用程序,您可能都需要确定某个单词是否存在于字符串中。在本节中,我们将...
阅读 8 分钟
? 在 Java 中,我们经常需要将一种时区的时间转换为另一种时区的时间。UTC 代表协调世界时 (UTC)。在 UTC 之前,它被称为格林威治标准时间 (GMT)。印度用户在处理 IST 时间时需要将其转换为 UTC 时间...
5 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India