我正在尝试编写一个程序,该程序给定了用户输入的字符串,从而找到了列表中所有可用的字谜? 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个字符串是否彼此为字谜。
答案 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" ]