輸入:`"ABCCD,CDA,BCDD,DCA,ADC,BCD,CDCAB"`,輸出分組:`ABCCD+CDCAB` (字母 A,B,C,C,D)、`CDA+DCA+ADC` (A,C,D) 等。
string input = "ABCCD,CDA,BCDD,DCA,ADC,BCD,CDCAB";
var groups = input.Split(',')
.GroupBy(w => new string(w.OrderBy(c => c).ToArray())) // 排序簽名分組
.Select((g, i) => new { GroupNo = i+1, Words = g.ToList() })
.ToList();
foreach (var g in groups) {
Console.WriteLine($"第{g.GroupNo}組:{string.Join(",", g.Words)}");
}
第1組:ABCCD,CDCAB
第2組:CDA,DCA,ADC
第3組:BCDD
第4組:BCD
string GetSignature(string w) {
int[] cnt = new int[26];
foreach (char c in w) cnt[c-'A']++;
return string.Join("#", cnt); // "1#2#1#0#1#0..."
}
// 替換 GroupBy key 為 GetSignature(w)
時間複雜度:O(n * k) (n單詞數, k平均長度),空間 O(n)。