获得回文的最小char替换数

时间:2013-09-23 20:54:30

标签: algorithm graph greedy disjoint-sets

我想从TopCoder解决this问题,其中给出了一个字符串,并且在每一步中你必须用另一个字符替换所有出现的字符(你选择的)字符(您选择的),以便在所有步骤结束后得到palindrome。问题是确定最小的替换总数。

到目前为止的想法: 我可以确定每一步之后的字符串只是图中的节点/顶点,并且每个边的成本是在步骤中进行的替换的数量,但是我没有看到如何使用贪婪(它是绝对不是Minimum Spanning Tree问题。我认为识别所有可能的节点并不是很有意义。边缘成本并转换Shortest Path problem中的问题。另一方面,我认为在每一步中,用最大数量的冲突替换字符X是有意义的,字符Y与字符串中最常出现的X冲突。

无论如何,我无法证明它有效。此外,我无法确定任何已知的问题。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您需要识别不连续的字符集。分离字符集是一组字符,它们都必须成为相同的字符才能使字符串成为回文。

示例:

假设我们有字符串abcdefgfmdebac

它有3个分离集,abcdefgm

算法:

  1. 选择第一个字符并检查其中所有出现的字符,然后拾取集合中的其他字符。 在示例字符串中,我们从a开始,然后选择bc(因为它们位于字符串中两个a的相对两侧)。我们重复bc的过程,但没有新的字符添加到集合中。所以abc是我们的第一个分离集。 继续使用其余字符执行此操作。

  2. n个字符(计算所有字符)的析取集需要n-m个替换,其中m是最常见字符的出现次数。 所以简单地总结一下。

  3. 在我们的示例中,需要4 + 2 + 2 = 8次替换。