我需要一种非蛮力算法来确定您需要从单词中删除的最小字母数量,才能使其成为回文拼写字母。
例如: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
具有一对aa
,abcba
对aa
和bb
,{ {1}}有aaab
)我曾考虑过删除一个字母的所有倍数,然后返回新单词1的长度,或者返回它的长度(如果为0的话)。这适用于很多单词,但是仍然可以失败了一些。例如:
aaa
我在这里错过了一些超级简单的东西吗?我该如何构建一种算法,该算法将返回您需要从单词中删除的最小字母数才能得到回文字母的字母?
答案 0 :(得分:5)
我在这里错过了一些超级简单的东西吗?
是的,你是:-)
作为回文的七巧板可以表征如下:
当且仅当存在一个字符w
且c
中c
的出现数是奇数(我让你看看为什么会这样,对简单的案例进行测试。
因此,给定一个单词w
,请为w
的每个字符计数,该字符出现的次数。然后计算在w
中出现奇数次的字符(我们称其为w
)。如果k
或w
,则0
可以作为回文的字谜删除的字母数为k=0
。否则为k=1
。