private List<List<string>> FindAnagrams(string[] words) { var anagrams = new List<List<string>>(); for (int i = 0; i < words.Length; i++) { var word = words[i]; var anagram = new List<string>() { word }; for (int j = i + 1; j < words.Length; j++) { if (Match(word, words[j])) { anagram.Add(words[j]); } }
if (anagram.Count > 1) { anagrams.Add(anagram); } }
return anagrams; } privateboolMatch(string word, string candidate) { if (word.Length != candidate.Length) { returnfalse; }
int[] letters = newint[26]; foreach (var letter in word) { letters[letter - 'A']++; }
foreach (var letter in candidate) { letters[letter - 'A']--; }
// length -> squares var squares = new Dictionary<int, List<int>>(); // anagrams.Select(a=>a[0].Length).Max() = 9 for (int i = 0; i < (int)Math.Sqrt(1_000_000_000); i++) { var s = i * i; var length = s.ToString().Length; if (!squares.ContainsKey(length)) { squares[length] = new List<int>(); }
privateintGetMaxSquare(List<string> a, Dictionary<int, List<int>> squares) { var candidates = squares[a[0].Length]; int max = int.MinValue; foreach (var c in candidates) { var square = GetSquare(a, c.ToString(), candidates); if (max < square) { max = square; } }
privateintGetSquare(List<string> a, string candidate, List<int> squares) { var map = new Dictionary<char, char>(); for (int i = 0; i < a[0].Length; i++) { if (map.ContainsKey(a[0][i])) { if (map[a[0][i]] != candidate[i]) { return-1; } }
map[a[0][i]] = candidate[i]; }
if (map.Values.Distinct().Count() != map.Count) { return-1; }
var other = a[1]; StringBuilder sb = new StringBuilder(); for (int i = 0; i < other.Length; i++) { sb.Append(map[other[i]]); }
int first = int.Parse(candidate); int second = int.Parse(sb.ToString()); if (squares.BinarySearch(second) >= 0) { return Math.Max(first, second); }