给定单词的算法返回从它中删除所需的最小字母数量以成为回文的字谜

Posted

技术标签:

【中文标题】给定单词的算法返回从它中删除所需的最小字母数量以成为回文的字谜【英文标题】:Algorithm that given a word returns the minimum amount of letters needed to remove from it to become an anagram of a palindrome 【发布时间】:2019-08-29 18:45:54 【问题描述】:

我需要一种非暴力算法来确定您需要从单词中删除的最少字母数量,以使其成为回文的字谜。

例如:abba -> 0、abbac -> 0、aabbfghj -> 3、a -> 0、abcdefghij -> 9。

蛮力算法可能如下所示:

1. Send word to method (2.) with counter 0
2. Check if any anagrams of word is palindrome, if yes return counter, if no go to 3.
3. Remove head of word, send to method (2.) with counter++

我相信蛮力方法是 O(n*n!) 复杂度(因为对于每个单词,有 n! 个字谜和要删除的 n 个字母)。例如,对于字符串 n=1000,这将花费太长时间。所以我需要一个更好的算法,但我不确定我可以在字符串上检查什么来确定需要删除的字母数量。

由于 n>1 的所有回文在某处都有一对/多个字母(aba 有一对 aaabcbaaabbaaabaaa)我想过删除一个字母的所有倍数,然后返回新单词 1 的长度,或者如果它是 0,则只返回长度。这适用于很多单词,但对于某些单词仍然失败。例如:

"aabbfghj" (remove pairs) -> "fghj" (length >0) -> return length-1 = 3 correct
"aabbcc" -> "" (!length >0) -> return length = 0 correct
"aaabb" -> "" -> 0 correct
"aaabbb" -> "" -> 0 correct
"aaabbbccdef" -> "def" -> 2 correct
"aaaaab" -> "b" -> 0 correct
"aabbc" -> "c" -> 0 correct
"aaabbc" -> "c" -> 0 incorrect (should be 1)

我在这里错过了一些超级简单的东西吗?我如何构建一个算法,该算法将返回您需要从一个单词中删除的最少字母数量以获得回文的 angram?

【问题讨论】:

【参考方案1】:

我在这里错过了一些超级简单的东西吗?

是的,你是:-) 作为回文的变位词可以表征如下: 一个词w 是回文的变位字母当且仅当,最多存在一个字符c 使得cw 中的出现次数是奇数(我让你看看为什么这是真的,在简单的情况下进行测试)。

因此,给定一个单词w,计算w 的每个字符出现的次数。然后计算在w(我们称之为k)中有多少个字符出现奇数次。如果k=0k=1,则w 可以是回文的字谜要删除的字母数是0。否则为k-1

【讨论】:

以上是关于给定单词的算法返回从它中删除所需的最小字母数量以成为回文的字谜的主要内容,如果未能解决你的问题,请参考以下文章

找到对给定数组进行排序所需的remove-then-append操作的数量

没有重复的排列算法?

给定数组表示 S 所需的最小数字计数

2022-02-11:单词缩写。 给定一个由n个不重复非空字符串组成的数组,你需要按照以下规则为每个单词生成最小的缩写。 初始缩写由起始字母+省略字母的数量+结尾字母组成。 若存在冲突,亦即多于一个单

Leetcode 583.两个字符串的删除操作

1822. 最小移动次数