【问题标题】: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 方法中使用它来对列表进行排序,其中所有字谜组彼此相邻。

标签: java arrays anagram


【解决方案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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    相关资源
    最近更新 更多