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

如何在给定用户输入的O(logN)时间内搜索anagram?

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

    嗨,我已经想了好几天了。

    我正在尝试实现一个程序,将字典读入列表并对其进行排序 O(N) O(对数N) 时间。我可以按字母对每个单词进行排序,并按O(N)的字母顺序对列表进行排序。

    例如,“act”是anagram组“act”、“cat”和“tac”的键。

    arr=['act','cat','tac','bad','fad'] 
    

    排序后

    [['act', 'act'], ['cat', 'act'], ['tac', 'act'], ['bad', 'abd'],  ['fad', 'adf']] 
    

    但是二进制搜索只找到一个目标,所以它只会为'act'下的anagram group返回'tac'。我的二进制搜索代码:

    def binarySearch(arr, lower, upper, target):
    anagramList=[]
    if upper >= lower:
        mid = lower + ((upper - lower) // 2)
        if areAnagrams(arr[mid][1],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
    

    我试着把他们这样分组

    [['act','act','cat','tac'],['bad','abd'],['fad','daf]]
    

    但是它需要O(N^2)的复杂度比O(N)大?有人能建议我怎么做吗?谢谢。

    编辑: 例如,如果查询字符串是alppe,则输出将包含单词appel和apple。

    2 回复  |  直到 6 年前
        1
  •  1
  •   leotrubach    6 年前

    您需要使用来自 collections

    from collections import Counter, defaultdict
    
    
    class hashablecounter(Counter):
        def __hash__(self):
            return hash(tuple(sorted(self.items())))
    
    
    d = defaultdict(list)
    arr=['act','cat','tac','bad','fad']
    
    for a in arr:
        d[hashablecounter(a)].append(a)
    
    s = 'cat'
    print('Anagrams for ', s, ' are ', d[hashablecounter(s)])
    
        2
  •  1
  •   Håken Lid    6 年前

    你可以用一本字典,关键字是字母排序的单词。

    from collections import defaultdict
    anagrams = defaultdict(list)
    
    arr=['act','cat','tac','bad','fad']
    
    for word in arr:
        anagrams[''.join(sorted(word))].append(word)
    
    def get_anagram(user_input):
        return anagrams[''.join(sorted(user_input))]
    

    >>> get_anagram('tca')
    ['act', 'cat', 'tac']