查找给定字符串的所有回文子串(Java)2024 年 9 月 10 日 | 阅读 8 分钟 给定一个字符串 str,我们的任务是找到那些是回文形式的子字符串,并且它们应该是给定字符串中所有不同的回文子字符串。 示例 1输入 输出 不同的回文子字符串总共有 8 个。它们是 a b bb bbb bbcbb bcb c e 示例 2输入 输出 不同的回文子字符串总共有 5 个。它们是 a b c d e 示例 3输入 输出 不同的回文子字符串总共有 11 个。它们是 i ippi issi ississi m p pp s sis ss ssiss 方法:使用暴力算法算法步骤 1:声明一个二维布尔数组,并必须以对角线的方式填充它。 步骤 2:验证每个 K。即 (0,1,2,.....) 步骤 3:假设 K=0,表示只有一个元素。因为单个字符是回文,在这种情况下我们得到 true。 步骤 4:如果 K = 1,我们确定两端是否相同并返回 true;否则,我们返回 false。 步骤 5:如果 K 不相同,我们检查两端是否相同,并查看 ar[i+1][j-1] 是否返回 true;如果是,我们将其设置为 true;如果不是,则将其设置为 false。每次找到 true 时,我们将字符串添加到 set 数据结构中。 步骤 6:返回回文子字符串。 实施文件名:PlaindromeSubstringBrute.java 输出 The total distinct palindromic substrings are: 8 a b bb bbb bbcbb bcb c e The total number of distinct palindromic substrings are : 8 复杂度分析 时间复杂度为 O(N2 * log(N)),其中 'N' 表示所取字符串的长度,因为我们在遍历数组时将元素插入集合需要 log(N) 时间。空间复杂度为 O(N2),因为使用了二维数组。 方法:使用 KMP(Knuth-Morris-Pratt)算法在此方法中,我们采用了 KMP 技术来有效地查找回文子字符串。它通过迭代遍历字符串并比较字符来查找匹配的前缀和后缀。当识别出匹配的后缀和前缀时,KMP 数组会被更新以跟踪匹配前缀的长度。如果找到回文,则将回文数组中的匹配元素设置为 false,以防止其被计算多次。通过消除对回文子字符串不必要的计数,这种优化可以精确地计算出唯一的。 算法步骤 1:声明 N 来初始化给定字符串 "str" 的长度,然后初始化 arr[N][N] 来验证子字符串是否为回文。 步骤 2:对于单个字符,将 arr[i][i] 初始化为 true。 步骤 3:查找长度为二的回文,识别相邻的字符。 步骤 4:迭代长度大于二的子字符串以查找回文, 步骤 5:如果字符串的两端匹配并且内部子字符串是回文,则更新 arr[i][j]。 步骤 6:为了增强回文检测,使用 KMP 方法。 步骤 7:确定前缀和后缀,以确保回文计数准确。 步骤 8:在遍历子字符串时,将字符添加到每个子字符串以创建新的子字符串。 步骤 9:如果找到一个子字符串是回文,则打印该子字符串并增加计数。 步骤 10:打印不同回文子字符串的总数。 实施文件名:plaindromeSubstringsDP.java 输出 The total distinct palindromic substrings are: a b bb bbcbb bcb c bbb e The total number of distinct palindromic substrings are : 8 复杂度分析 时间复杂度为 O(N2),空间复杂度为 O(N2),其中 'N' 表示给定字符串的长度。 方法:Manacher 算法通过考虑每个字母作为枢轴,从两侧扩展,以确定查询中以枢轴字符为中心的偶数和奇数长度回文的长度。将结果存储在两个数组(odd & even)中。将前一个阶段识别出的每个回文都放入哈希映射中。为了创建唯一的单字母回文子字符串,还将字符串中的每个单独字符插入到 HashMap 中。 最后一步是打印存储在哈希映射中的每个值(由于哈希映射的属性,只会哈希不同的项)。通过查看映射的大小,可以确定不同连续回文子字符串的数量。 算法步骤 1:声明一个名为 m 的 TreeMap,以存储不同的回文子字符串及其计数。 步骤 2:找出输入字符串 str 的长度,并初始化一个二维数组 row 来存储回文长度。 步骤 3:为了简化回文识别,在字符串的开头和结尾分别附加特殊字符 '@' 和 '#'。 步骤 4:使用两个循环遍历字符串:一个用于偶数长度的回文,另一个用于奇数长度的回文。 步骤 5:对于字符串中的每个字符,执行以下步骤。 步骤 5.1:检查以使当前字符周围的回文更大。 步骤 5.2:更新 row 数组中的回文长度。 步骤 5.3:将找到的回文子字符串添加到 m TreeMap 中。 步骤 6:打印 m 中保留的所有不同的回文子字符串。 步骤 7:确定 TreeMap m 的大小,以打印不同回文子字符串的总数。 实施文件名:PalindromeSubstringMancherAlgo.java 输出 The total distinct palindromic substrings are: a b bb bbb bbcbb bcb c e The total number of distinct palindromic substrings are : 8 复杂度分析 上述代码的时间复杂度为 O(N2),其中 'N' 表示给定字符串的长度,空间复杂度为 O(N)。 |
Java 中有五种创建对象的方式:Java new 运算符 Java Class.newInstance() 方法 Java 的 constructor 的 newInstance() 方法 Java Object.clone() 方法 Java 对象序列化和反序列化 1) Java new 运算符 这是在 Java 中创建对象的流行方式。 new 运算符是...
阅读 6 分钟
?在特定时刻存在于 JVM(Java 虚拟机)中的所有 Java 对象都包含在 Java 堆转储中。在堆内存中,JVM 为数组或类实例对象分配空间。垃圾回收器启动...
阅读 3 分钟
在 Java 中,使用最新版本会带来一些新功能。它删除了过时的功能。更新的 Java 版本包含重要的增强功能,可提高 Java 应用程序的性能、稳定性和安全性。安装最新版本的 Java 可确保 Java 应用程序...
阅读 2 分钟
根据应用程序需要支持的并发连接数,定义连接池要求,确定最大池大小。选择连接池是否应该是动态的——即,根据需求进行扩展或收缩。选择超时机制,例如……
阅读 3 分钟
? 在 Java 中,线程可以分为守护线程和非守护线程(用户线程)。非守护线程是 Java 虚拟机(JVM)在关闭之前等待完成的典型线程,而守护线程是后台线程,它们不会阻止 JVM 在...时退出。
5 分钟阅读
Java 中的 Set 是一个唯一元素的集合,而 Stream 有效地执行过滤、映射和减少数据等功能任务。将 Set 转换为 Stream 允许使用 Java 8 中引入的 Stream API 轻松处理其元素……
阅读 3 分钟
Java 中的 BreakIterator ious() 方法及示例 java.text.BreakIterator 类包含一个 ious() 方法。通过调用 current() 方法可以获得当前边界,而使用 BreakIterator 类可以获得其后面 ious 边界的索引。它给出了第一个...的偏移量。
阅读 3 分钟
Java 提供了 File 类来表示系统中的文件或目录。File 类位于 java.io 包中。为了对文件或目录执行操作,File 类提供了几种有用的方法。File 类的 delete() 方法是其中之一...
阅读 3 分钟
Java 静态类型与动态类型 Java 是一种强类型语言,它将变量、表达式和对象分类为静态类型。然而,Java 也通过使用其面向对象的特性来支持动态类型。在本节中,我们将探讨 Java 中的静态类型和动态类型概念...
5 分钟阅读
最大正方形子矩阵问题是指在一个给定的二进制矩阵中找到最大的正方形子矩阵的大小,其中子矩阵的所有元素都为 1。这是一个经典的动态规划问题,用于高效地解决二维问题。在 Java 中,…
阅读 10 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India