[Buổi 20][Chuỗi][HW] Bài 6: Sinh slug từ tiêu đề


LÀM BÀI

Points: 100
Time limit: 1.0s
Memory limit: 256M

Author:
Problem types
Allowed languages
C++

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

  1. Đọc một dòng title.
  2. Giữ alphanumeric và lowercase chữ.
  3. Mọi nhóm ký tự khác → một dấu - giữa hai nhóm alphanumeric.
  4. Không - ở đầu/cuối.
  5. 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, +! 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

There are no comments at the moment.

Zalo