代码之家  ›  专栏  ›  技术社区  ›  Sook Lim

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

  •  2
  • Sook Lim  · 技术社区  · 6 年前

    我试图编写一个程序,由用户给定一个输入字符串,查找列表中所有可用的anagram?O(KLogn+W)时间复杂度不包括排序的时间复杂度。

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

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

    会变成

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

    为了满足O(KLogn)时间复杂度,我决定使用二进制搜索。但我不知道该怎么做?到目前为止,这是我的当前代码,但它只在anagramList后面附加单词的第一个anagram?

    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
    

    区域图检查两个字符串是否相互为anagram。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Leo K    6 年前

    对每个单词中的字符进行排序可能是正确的方法,但您需要存储原始单词并映射每个单词 已排序 字符序列到一个或多个单词的列表,以便您可以显示所有有效的结果。您将需要这样一个映射(左边是一个排序的字符序列,右边是所有有效的单词,都是这些字符的anagrams ):

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

    ...

    一旦有了这个映射,就可以使用二进制搜索或直接使用Python的散列机制来搜索它,方法是使用Python dict 对象(对于大小为N的字典,其二进制搜索效率不低于log2(N),并且在解释器中进行编码,因此速度非常快)。

    一旦构建了字典,查找anagrams就需要对输入序列进行排序(最坏情况下为O(k)),然后查找匹配的字符串(O(log(N)),以便进行二进制搜索。它完全不依赖于输出大小(输出已经在每个字典条目中就绪)。

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

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