[Buổi 20][Chuỗi][HW] Bài 6: Sinh slug từ tiêu đề
Sinh slug từ tiêu đề
Bối cảnh
Một hệ thống bài viết cần chuyển tiêu đề tự do thành slug đơn giản. Chỉ giữ chữ cái và chữ số ASCII, chuyển chữ cái về lowercase. Mọi chuỗi ký tự khác (space, _, dấu câu...) được xem như separator và phải nén thành đúng một dấu -. Slug không được bắt đầu hoặc kết thúc bằng -. Nếu tiêu đề không có ký tự alphanumeric nào, output là EMPTY.
Ví dụ Hello, C++ World! trở thành hello-c-world: dấu phẩy, khoảng trắng và ký tự + đều chỉ đóng vai trò separator. Bài Medium yêu cầu xây output mới thay vì erase liên tục trên input. Trạng thái pendingSeparator hoặc kiểm tra ký tự cuối của output giúp tránh nhiều dấu - liên tiếp và tránh separator ở biên.
Slug là ví dụ điển hình của việc không nên replace từng ký tự một cách cục bộ. Quyết định có phát dấu - hay không phụ thuộc vào cả nhóm ký tự phía trước và việc sau đó có xuất hiện một nhóm alphanumeric mới. Cờ pendingSeparator lưu đúng thông tin tối thiểu đó, giúp loại cả leading/trailing separator mà không cần bước cleanup thứ hai.
Yêu cầu
- Đọc một dòng title.
- Giữ alphanumeric và lowercase chữ.
- Mọi nhóm ký tự khác → một dấu
-giữa hai nhóm alphanumeric. - Không
-ở đầu/cuối. - Nếu không có alphanumeric in
EMPTY.
Input
Một dòng title.
Output
Slug hoặc EMPTY.
Ràng buộc
|s|≤5000.
Ví dụ 1
Input
Hello, C++ World!
Output
hello-c-world
Giải thích
Các ký tự alphanumeric tạo hello, c, world. Mọi dấu phẩy, space, + và ! nằm giữa các nhóm được nén thành một separator. Vì ++ là một nhóm separator nên chỉ tạo một dấu -. Kết quả là hello-c-world.
Ví dụ 2
Input
TNUT 2026
Output
tnut-2026
Giải thích
Space ở đầu/cuối không tạo dấu - vì chưa có hoặc không còn nhóm alphanumeric phía sau. TNUT được lowercase thành tnut, 2026 giữ nguyên số và khoảng trắng giữa hai nhóm tạo một -. Output tnut-2026.
Thông tin học tập
- Module: M06
- Buổi: B20
- Loại bài: HOMEWORK
- Độ khó: Medium
- Concepts: std::string, normalization, character scanning, lowercase, separator compression
- Giới hạn kiến thức: B01-B20
- Time limit: 1 second(s)
- Memory limit: 256 MB
- Point: 100
Comments