获取数组中最大的字谜组

Posted

技术标签:

【中文标题】获取数组中最大的字谜组【英文标题】:Get largest Group of anagrams in an array 【发布时间】:2018-07-19 19:54:53 【问题描述】:

我被要求在一个列表中找到最大的字谜组。我相信我必须在另一个循环内有一个累积循环,以跟踪最大数量的项目。问题是我不知道如何计算每个字谜有多少。我已经能够根据它们的字谜对数组进行分组。所以从索引 1-3 是一个字谜,4-10 是另一个,等等。我如何搜索并计算我有多少个字谜?然后将每个与之前的计数进行比较。

代码示例:

public static String[] getLargestAnagramGroup(String[] inputArray) 

    ArrayList<String> largestGroupArrayList = new ArrayList<String>();

    if (inputArray.length == 0 || inputArray == null) 
        return new String[0];
    

    insertionSort(inputArray, new AnagramComparator());

    String[] largestGroupArray = new String[largestGroupArrayList.size()];
    largestGroupArrayList.toArray(inputArray);
    System.out.println(largestGroupArray);
    return largestGroupArray;

更新:我们就是这样解决的。有没有更有效的方法?

public static String[] getLargestAnagramGroup(String[] inputArray) 

    int numberOfAnagrams = 0;
    int temporary = 1;
    int position = -1;
    int index = 0;

    if (inputArray == null) 
        return new String[0];
    
    insertionSort(inputArray, new AnagramComparator());
    for (index = 0; index < inputArray.length - 1; index++) 
        if (areAnagrams(inputArray[index], inputArray[index + 1])) 
            temporary++;
         else 
            if (temporary > numberOfAnagrams) 
                numberOfAnagrams = temporary;
                position = index;
                temporary = 1;
             else if (temporary < numberOfAnagrams) 
                temporary = 1;
            
        
    
    if (temporary > numberOfAnagrams) 
        position = index;
        numberOfAnagrams = temporary;
    
    String[] largestArray = new String[numberOfAnagrams];
    for (int startIndex = position - numberOfAnagrams + 1, i = 0; startIndex <= position; startIndex++, i++) 
        largestArray[i] = inputArray[startIndex];
    

    return largestArray;

【问题讨论】:

AnagramComparator 是做什么的? @NewUser AnagramComparator 比较 2 个索引并告诉我它们是否是字谜。在 InsertionSort 方法中使用它来对列表进行排序,其中所有字谜组彼此相邻。 【参考方案1】:

这里有一段代码可以帮助你。

public class AnagramTest 
public static void main(String[] args) 
    String[] input = "test", "ttes", "abcd", "dcba", "dbac";

    for (String string : getLargestAnagramGroup(input)) 
        System.out.println(string);
    


/**
 * Gives an array of Strings which are anagrams and has the highest occurrence. 
 * 
 * @param inputArray
 * @return
 */
public static String[] getLargestAnagramGroup(String[] inputArray) 
    // Creating a linked hash map to maintain the order
    Map<String, List<String>> map = new LinkedHashMap<String, List<String>>();

    for (String string : inputArray) 
        char[] charArray = string.toCharArray();
        Arrays.sort(charArray);
        String sortedStr = new String(charArray);
        List<String> anagrams = map.get(sortedStr);
        if (anagrams == null) 
            anagrams = new ArrayList<String>();
        

        anagrams.add(string);

        map.put(sortedStr, anagrams);
    

    Set<Entry<String, List<String>>> entrySet = map.entrySet();
    List<String> l = new ArrayList<String>();
    int highestAnagrams = -1;
    for (Entry<String, List<String>> entry : entrySet) 
        List<String> value = entry.getValue();
        if (value.size() > highestAnagrams) 
            highestAnagrams = value.size();
            l = value;
        
    

    return l.toArray(new String[l.size()]);


这个想法是首先找到字谜。我正在使用对字符串的字符数组进行排序并使用LinkedhashMap

然后我将原始字符串存储在列表中,结果可用于打印或重复使用。

您必须不断计算字谜出现的次数,并且该值可用于解决您的问题

【讨论】:

我已经能够找到它们是否是彼此的字谜。问题只是找出如何计算它们。最终目标是返回具有最大组的数组。 @ZacharyKing :返回的String[] 具有最多的字谜。因此,数组的大小应该是您的答案。【参考方案2】:

这是我在 C# 中的解决方案。

public static string[] LargestAnagramsSet(string[] words)

    var maxSize = 0;
    var maxKey = string.Empty;

    Dictionary<string, List<string>> set = new Dictionary<string, List<string>>();

    for (int i = 0; i < words.Length; i++)
    
        char[] temp = words[i].ToCharArray();
        Array.Sort(temp);

        var key = new string(temp);

        if (set.ContainsKey(key))
        
            set[key].Add(words[i]);
        
        else
        
            var anagrams = new List<string>
            
                words[i]
            ;
            set.Add(key, anagrams);
        
        if (set[key].Count() > maxSize)
        
            maxSize = set[key].Count();
            maxKey = key;
        
    
    return string.IsNullOrEmpty(maxKey) ? words : set[maxKey].ToArray();

【讨论】:

以上是关于获取数组中最大的字谜组的主要内容,如果未能解决你的问题,请参考以下文章

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

打印输入字谜中字谜和字谜单词本身的最大出现次数

如何获取数组中指定个数的几个最大值

获取一组数据的最大值和最小值

数组中获取最大值和最小值

给定一个字符串数组,返回所有的字谜字符串组