话说一道百度的题目如下:
给你一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在给你一个字典,用户输入一个单词,让你根据字典找出这个单词有多少个兄弟单词。 (这道题面试官说有O(1) 的解法,。。。。。)
解答 : 这个其实是算是无序的字符串的匹配问题。一般来说,我们要一个一个比较和查找,看两个串是否完全相等。
不过其实我们可以换一个想法,为每一个字符分配一个素数,那么一个字符串可以唯一表示成所有组成字母的乘积,这个属性仅仅表示了组成的元素而忽略了组成的顺序。
设数组 primelem[26] = {2, 3, 5, 7, 11, 13, ....,}
对一个字符串来说s = "acd", 则属性 attr = primelem['a'-'a'] * primelem['c'-'a'] * primelem['d'-'a'];
于是得到检索算法入下:
1. 对字典中的每个单词,求出他的 attri值,保存在一个数组中。
2. 对欲检索的单词,求出他的attri值,为attr-search
3. 遍历字典的atrri数组,所有和attr-search相等的位置多对应的单词都是所求的兄弟单词