我想从TopCoder解决this问题,其中给出了一个字符串,并且在每一步中你必须用另一个字符替换所有出现的字符(你选择的)字符(您选择的),以便在所有步骤结束后得到palindrome。问题是确定最小的替换总数。
到目前为止的想法: 我可以确定每一步之后的字符串只是图中的节点/顶点,并且每个边的成本是在步骤中进行的替换的数量,但是我没有看到如何使用贪婪(它是绝对不是Minimum Spanning Tree问题。我认为识别所有可能的节点并不是很有意义。边缘成本并转换Shortest Path problem中的问题。另一方面,我认为在每一步中,用最大数量的冲突替换字符X是有意义的,字符Y与字符串中最常出现的X冲突。
无论如何,我无法证明它有效。此外,我无法确定任何已知的问题。有什么想法吗?
答案 0 :(得分:0)
您需要识别不连续的字符集。分离字符集是一组字符,它们都必须成为相同的字符才能使字符串成为回文。
示例:
假设我们有字符串abcdefgfmdebac
它有3个分离集,abc
,de
和fgm
算法:
选择第一个字符并检查其中所有出现的字符,然后拾取集合中的其他字符。
在示例字符串中,我们从a
开始,然后选择b
和c
(因为它们位于字符串中两个a
的相对两侧)。我们重复b
和c
的过程,但没有新的字符添加到集合中。所以abc
是我们的第一个分离集。
继续使用其余字符执行此操作。
n
个字符(计算所有字符)的析取集需要n-m
个替换,其中m是最常见字符的出现次数。
所以简单地总结一下。
在我们的示例中,需要4 + 2 + 2 = 8次替换。