将字符串转换为完美数字

时间:2015-07-17 06:04:06

标签: algorithm

给定一个字符串,我们需要找到最大的方块,可以通过用数字替换它的字符来获得(不允许前导零),其中相同的字符总是映射到相同的数字,不同的字符总是映射到不同的数字。如果没有解决方案,则返回-1。

考虑字符串" ab"如果我们用8替换字符a,用1替换b,我们得到81,这是一个正方形。

如何找到给定字符串?字符串长度可以是最大值11。

请帮我找一个合适有效的方法

1 个答案:

答案 0 :(得分:4)

抱歉无法评论,声誉不够,所以我会在这里回答。

@ mat7关于你在问题评论中所说的内容,不是你不必为a到z的每个字母都这样做。您只需要为字符串中的字母执行此操作(最多12个字母,而不是26个字母)。 我要检查的第一件事就是你有多少不同的字母,如果是11或12个不同的字母你可以直接返回-1,因为你不能有不同的字母具有相同的数字。

现在,假设输入字符串为“fdsadrtas”,则采用仅包含每个不同字母的新数组=> “fdsadrt” 使用这个数组你可以尝试所有的可能性(排除明显的不匹配选项,如果你将'f'设置为4而'd'设置为5,'s'只能是12367890(并且f永远不能为0)),这样你就可以了将排除许多可能性,最坏情况10!而不是12 ^ 10。 (实际上9 * 9!第一个的测试从未成为0,但它足够接近)

编辑2:+1 samgak好主意! 最后一位数字只能是0,1,4,5,6,9所以最差的测试数量甚至会下降到9 * 6 * 8!

10!远远小到可以进行暴力测试,保持你找到的更高的平方值,你就完成了。

编辑:

实际上它会起作用(在有限的合理时间内),但现在我已经考虑过它是错误的方法。

您将使用更少的时间来查找可能是您的字符串解决方案的所有正方形数字,使用我在上面给出的示例,它是一个长度为9的字符串,如果可以成功映射,则检查长度为9的每个正方形进入字符串。

对于长度为12(最差情况)的字符串,您必须检查316'228到999'999的平方值,该值小于先前命题的> 2百万检查。如果你开始接受长琴弦,那么另一个命题可能会变得更快,但只有12个你这样做更快。