Java 中的字符串回文排列

2024 年 9 月 10 日 | 阅读 8 分钟

我们得到了一个字符串 inStr。我们的任务是找出并打印出使用 inStr 字符串可以生成的所有回文。请注意,inStr 字符串的所有字符都必须用于生成回文。如果不存在回文,则显示适当的消息。

给定一个字符串,我们需要打印出可以使用该字符串中的字母生成的所有可能的 palindrome。示例:

示例 1

输入

字符串 inStr = "ttpkkp"

输出

"ptkktp", "pkttkp", "tpkkpt", "tkppkt", "kpttpk", "ktpptk" 是输入字符串的回文排列。

解释

这些是唯一包含了输入字符串 inStr 的所有字符并且也是回文的字符串。

示例 2

输入

字符串 inStr = "kkbbckdkd"

输出

"kkbdcdbkk" "kkdbcbdkk" "kbkdcdkbk" "kbdkckdbk" "kdkbcbkdk" "kdbkckbdk" "bkkdcdkkb" "bkdkckdkb" "bdkkckkdb" "dkkbcbkkd" "dkbkckbkd" "dbkkckkbd"

解释

这些是唯一包含了输入字符串 inStr 的所有字符并且也是回文的字符串。

示例 3

输入

字符串 inStr = "kkb"

输出

"kbk"

解释

唯一的字符串 "kbk" 包含了输入字符串 inStr 的所有字符并且也是一个回文。

简单方法

简单的方法是找出字符串 inStr 的所有子集。之后,筛选出大小等于 inStr 的子集。在筛选出的子集中,检查哪些子集是回文并打印它们。

文件名: PalindromePermutation.java

输出

For the string: ttpkkp
The permutated palindrome strings are: 
kpttpk tpkkpt ktpptk ptkktp pkttkp tkppkt 

For the string: kkbbckdkd
The permutated palindrome strings are: 
kbdkckdbk bdkkckkdb kkbdcdbkk kdkbcbkdk dkkbcbkkd kdbkckbdk bkkdcdkkb kbkdcdkbk dbkkckkbd kkdbcbdkk dkbkckbkd bkdkckdkb 

For the string: kkb
The permutated palindrome string is: 
kbk

复杂度分析:程序执行字符串的排列。程序还使用了循环。然而,字符串的排列是主要的耗时过程,这使得程序的时间复杂度为 O(n!)。此外,程序使用哈希集来存储输入字符串的排列。因此,程序空间复杂度也为 O(n! x n),其中 n 是输入字符串中存在的总字符数。

在查看了上述程序的复杂度分析后,很明显需要进行一些优化。这是因为上述程序的复杂度很高。在编写程序之前,让我们看一下以下步骤。

步骤 1:首先,需要检查是否可以使用输入字符串的字符生成回文。如果无法生成回文,则返回。

步骤 2:在完成第一步的检查后,我们可以通过考虑输入字符串中每个字符的一半频率来创建第一个回文字符串的“前半部分”(字典序最小)。

步骤 3:现在,遍历前半部分字符串的所有可能排列,并在每次迭代时在末尾添加该部分的反转。

步骤 4:如果字符串长度是奇数,则将具有奇数频率的字符添加到中间,以构成回文。

现在,请看下面的程序。

文件名: PalindromePermutation1.java

输出

For the string: ttpkkp
The permutated palindrome strings are: 
ktpptk ptkktp pkttkp tkppkt kpttpk tpkkpt 

For the string: kkbbckdkd
The permutated palindrome strings are: 
dbkkckkbd kdbkckbdk kkbdcdbkk dkkbcbkkd kdkbcbkdk kbkdcdkbk bdkkckkdb bkkdcdkkb kbdkckdbk kkdbcbdkk bkdkckdkb dkbkckbkd 

For the string: kkb
The permutated palindrome string is: 
kbk

复杂度分析:程序执行的是“前半部分”字符串的排列。这使得程序的时间复杂度为 O((n / 2)!)。此外,程序使用哈希集来存储输入字符串的排列。因此,程序空间复杂度也为 O((n / 2)! x n / 2),其中 n 是输入字符串中存在的总字符数。