using System.Collections.Generic; public class Comparer : IEqualityComparer<string> { public bool Equals(string left, string right) { if (left.Length != right.Length) return false; var leftCount = new int[26]; foreach (var ch in left) { ++leftCount[ch - 'a']; } var rightCount = new int[26]; foreach (var ch in right) { var index = ch - 'a'; if (++rightCount[index] > leftCount[index]) return false; } return true; } public int GetHashCode(string obj) { var hashCode = 0; for (int i = 0; i < obj.Length; ++i) { hashCode ^= 1 << (obj[i] - 'a'); } return hashCode; } } public class Solution { public IList<IList<string>> GroupAnagrams(string[] strs) { var dict = new Dictionary<string, List<string>>(new Comparer()); foreach (var str in strs) { List<string> list; if (!dict.TryGetValue(str, out list)) { list = new List<string>(); dict.Add(str, list); } list.Add(str); } foreach (var list in dict.Values) { list.Sort(); } return new List<IList<string>>(dict.Values); } }