恐怖级算法二【据说百度面试题】

给你一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在给你一个字典,用户输入一个单词,让你根据字典找出这个单词有多少个兄弟单词。

===================
当然了,这个题目肯定是要给出最优解法了。不然就没什么难度了。所以是要建立数学模型的。

下面是我给出的算法:
类似于C++中定义常量的方法:
用一个足够大的十六进制数字,代表a,比如f(a)=F000;(排除3+6=2+7的可能性)
然后,对任意字母x都采用下述方式代表:
f(x)=pow(f(a),(x-a+1));
那这样,每个单词的所有字母加起来所得的结果,为该单词的最终值。
最终值一样的,就是兄弟了。
 
(其实考虑到实际情况,用10表示A就足够了。更有甚者,用26位数的16进制0x000000...000来表示某个字母,第0位表示有单词中a字母的个数。然后对每个单词进行统计,结果比较数的大小。)

另解:上述算法不够严谨,也就是说,如果有人故意说有几百个a的单词,那就不行了,这就需要用质数相乘法:定义a,b,c...分别为互不相等的质数。然后每个单词定义为这些质数相乘。结果一样即可。
posted @ 2009-12-14 20:55  傲衣华少  阅读(474)  评论(0编辑  收藏  举报