获取数组中最大的字谜组
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();
【讨论】:
以上是关于获取数组中最大的字谜组的主要内容,如果未能解决你的问题,请参考以下文章