给定输入字符串,如何搜索O(k logN + W)时间中的所有字谜,其中W是输出大小,k是字符串中的最大字符?

时间:2018-08-09 12:03:19

标签: python binary-search anagram

我正在尝试编写一个程序,该程序给定了用户输入的字符串,从而找到了列表中所有可用的字谜? O(klogN + W)的时间复杂度不包括排序的时间复杂度。

我的方法是先对每个单词按字母顺序排序,然后对列表按字母顺序排序。例如,这样的列表:

['act',bad','cat','tac']... 

将成为

['act','act','act','bad']

为了满足O(klogN)时间的复杂性,我决定使用二进制搜索。但是我不确定该怎么做?到目前为止,这是我目前的代码,但仅将单词的第一个字谜附加到anagramList吗?

def binarySearch(arr, lower, upper, target):
anagramList=[]
if upper >= lower:
    mid = lower + ((upper - lower) // 2)
    if areAnagrams(arr[mid],target):
        anagramList.append(arr[mid])
    elif arr[mid] > target:
        return binarySearch(arr, lower, mid - 1, target)
    else:
        return binarySearch(arr, mid + 1, upper, target)
return anagramList

areAnagrams检查2个字符串是否彼此为字谜。

1 个答案:

答案 0 :(得分:1)

在每个单词中对字符排序可能是正确的方法,但是您将需要存储原始单词并将每个 sorted 字符序列映射到一个或多个单词的列表,因此您可以显示所有有效结果。您将需要一个这样的映射(左侧是字符的排序序列,右侧是所有有效的单词,它们是这些字符的字谜 ):

"art" -> [ "art", "rat" ]
"acr" -> [ "car" ]

...

一旦有了此映射,就可以通过使用Python dict对象(对于大小为N的字典而言,其效率不亚于Python)来通过二进制搜索或直接使用Python的哈希机制进行搜索。 log2(N)用于二进制搜索,并且在解释器中进行了编码,因此非常快)。

一旦您构建了词典,查找字谜就需要对输入序列进行排序(最糟糕的是O(k)),然后找到匹配的字符串(对于二进制搜索,则为O(log(N)))。完全不依赖于输出大小(每个字典条目中的输出已经准备就绪)。

如果您决定不使用dict并坚持使用二进制搜索,则最好的数据结构很可能是列表列表,每个元素都包含[“ sorted-characters”,“ word1”,“ word2”,...等]。外部列表按每个内部列表中的第一项(排序的字符)排序,例如,使用上面的示例字谜:

["art", "art", "rat" ]
["acr", "car" ]