Duyệt chuỗi, đếm tần suất từng ký tự distinct. Cách đơn giản: lặp ngoài lấy ký tự đầu, đếm trong chuỗi còn lại, sau đó xóa tất cả ký tự đó — lặp cho đến khi chuỗi rỗng.
Mã nguồn (cách gốc)
using System;
public class Demo {
public static void Main() {
string str = "Website";
Console.WriteLine("Chuỗi: " + str);
while (str.Length > 0) {
char first = str[0];
int count = 0;
// Đếm xuất hiện của first trong str
for (int j = 0; j < str.Length; j++) {
if (str[j] == first) count++;
}
Console.WriteLine(first + " = " + count);
// Xóa tất cả ký tự first khỏi chuỗi
str = str.Replace(first.ToString(), string.Empty);
}
Console.ReadLine();
}
}
Kết quả
Chuỗi: Website
W = 1
e = 2
b = 1
s = 1
i = 1
t = 1
Cách hiệu quả hơn: Dictionary / LINQ GroupBy
using System.Linq;
using System.Collections.Generic;
// Dictionary
var freq = new Dictionary();
foreach (char c in str) {
freq[c] = freq.GetValueOrDefault(c, 0) + 1;
}
// LINQ GroupBy
var groups = str.GroupBy(c => c)
.Select(g => new { Char = g.Key, Count = g.Count() })
.OrderByDescending(x => x.Count);
foreach (var g in groups) {
Console.WriteLine($"{g.Char} = {g.Count}");
}
So sánh
| Phương pháp | Độ phức tạp | Bộ nhớ | Thứ tự xuất |
|---|---|---|---|
| Replace + Loop (gốc) | O(n²) | O(n) string mới | Theo thứ tự xuất hiện đầu tiên |
| Dictionary | O(n) | O(k) distinct chars | Không đảm bảo |
| LINQ GroupBy | O(n log k) | O(k) | Có thể sort |
Lưu ý
- Cách gốc sửa đổi chuỗi gốc (tạo string mới mỗi lần Replace) — kém hiệu năng với chuỗi dài.
- Dictionary nhanh nhất O(n), phù hợp production.
- Đếm không phân biệt hoa/thường:
char.ToLower(c)khi dùng làm key.