给定几个字符串,通过修改字母表可以在字典上最少多少个字符串?

时间:2012-12-16 22:58:44

标签: algorithm alphabetical

字符串的数量可以很大,如30000.给定N个字符串,输出哪些字符串可以在修改英文字母后最少。例如acdbe ......

例如,如果字符串是:

omm
moo
mom
ommnom

“妈妈”已经按字典顺序排列在原始英文字母表中。我们可以通过在字母表中切换“m”和“o”来制作“omm”这个词(“abcdefghijklonmpqrstuvwxyz”)。不管你做什么,你不能按字典顺序排列第一

任何快速的方法吗?除了尝试每一个可能的字母表之外,我没有办法解决这个问题

1 个答案:

答案 0 :(得分:0)

你希望能够说天气中的一个字符串(比方说s)可以做得更小。 您可以将其转换为检测图形中循环的问题。方法如下:

考虑由26个顶点组成的图:V = {'a','b',...,'z'} 假设s是最小的并按顺序考虑s的字母,先是第二个等等。

当您考虑第一个字母时,您知道对于所有其他字符串x,s [0]应小于x [0]。现在在s [0]到x [0]的图形中添加一条边,对于它们不是同一个字母的所有x。边缘意味着“小于”。 现在考虑第二个字母,但只看那些与s具有相同首字母的字符串。做同样的事情 - 在此缩减集中为所有y添加从1到y 1的边。 然后移到第三个字母,只考虑具有相同的第一个和第二个字母的字符串..依此类推(你可以使用一个Set数据结构,它首先包含所有的字符串,但是你可以随意删除它)

现在,在构建图表后,您想知道是否存在循环。 实际上,如果有一个循环,这意味着这个s不能是最小的,因为在循环之后你必须使循环中的第一个字母小于它自己,这是不可能的。  另一方面,如果你没有一个循环,那么图形就是一个DAG(有向无环图),任何DAG都可以进行拓扑排序,这意味着它的顶点(即字母表中的字母)可以按这样的顺序排序。方式使任何边缘从小到大。有了这个顺序,由于图形的构造方式,你将是最小的。

您可以查看detecting cycles in directed graphs - 这是一个非常常见的问题,其复杂性为O(|V|+|E|)。在这种情况下| V | = 26和| E | < = n(因为每次在图表中添加边缘时,都会减少要检查的字符串集合。)

因此,复杂性为O(n)

如果您想检查每个字符串,您将获得O(n^2)的整体复杂性。