如何对文本文件进行排序以在 O(MN) 时间复杂度中查找字谜,其中 M 是最大字符数,N 是单词数?

Posted

技术标签:

【中文标题】如何对文本文件进行排序以在 O(MN) 时间复杂度中查找字谜,其中 M 是最大字符数,N 是单词数?【英文标题】:How to sort a text file to find anagrams in O(MN) time complexity where M is the max number of characters and N is the number of words? 【发布时间】:2018-08-03 07:52:31 【问题描述】:

您好,我是 Python 新手,我想在线性时间内找到文件中的字谜组。字谜基本上是两个或多个单词,由相同的字母表组成,但排列方式不同。

首先,我将所有单词读入一个列表。显然,我可以使用基数排序按列对每个单词进行排序,基数排序应该使用稳定的计数排序。但我不知道我的计数排序应该做什么?我是否应该编写一个计数排序函数来获取一个单词并按字母顺序对其进行排序?然后在基数排序中调用它?

谁能给我一个关于如何解决这个问题的更清晰的想法?任何帮助将不胜感激!

【问题讨论】:

看起来基数排序可以像按数字排序一样容易地按字符排序。也许您应该按字母顺序对每个单词进行排序,然后您的列表将类似于 ['aab', 'aab', 'abc'] 并且您的解决方案将很明显 【参考方案1】:

希望这对您有所帮助。它也在 O(mn) 中

public List<List<String>> groupAnagrams(String[] strs)
    List<List<String>> result = new ArrayList<List<String>>();
    
    HashMap<ArrayList<Integer>, ArrayList<String>> map = new HashMap<ArrayList<Integer>, HashMap<ArrayList<String>>;
    
    for(String str : strs)
        ArrayList<Integer> arr = new ArrayList<Integer>();
        for(int i=0; i<str.length(); i++)
            arr[str.charAt(i)- 'a']++;
        
        
        if(map.containsKey(arr))
            map.get(arr).add(str);
         else 
            ArrayList<String> al = new ArrayList<String>();
            al.add(str);
            map.put(arr, al);
        
    
    
    result.addAll(map.values());
    
    return result;

【讨论】:

以上是关于如何对文本文件进行排序以在 O(MN) 时间复杂度中查找字谜,其中 M 是最大字符数,N 是单词数?的主要内容,如果未能解决你的问题,请参考以下文章

linux中如何对一个文本内容进行排序呢

linux中如何对一个文本内容进行排序呢

排序

排序

在o(N log N)时间内使用恒定的空间复杂度对链表进行排序

如何编写自定义排序器以在 UI 中按名称对 springdoc swagger 标签进行排序?