C8-11 · Nhóm từ cùng chữ cái
Xem dạng PDFĐề
Hai từ gọi là cùng chữ cái nếu sắp xếp lại các chữ của từ này thì được từ kia, tức là hai từ có cùng các chữ cái với cùng số lần xuất hiện (ví dụ nam và man; nhưng aab và abb không cùng chữ cái).
Cho một dòng gồm các từ khác nhau. Hãy chia các từ thành nhóm, mỗi nhóm gồm các từ cùng chữ cái với nhau, rồi in mỗi nhóm có ít nhất 2 từ trên một dòng.
Dữ liệu vào
Một dòng chứa các từ, cách nhau một dấu cách; mỗi từ chỉ gồm chữ thường a–z; không có từ nào lặp lại.
Kết quả
- Mỗi nhóm có ít nhất 2 từ in trên một dòng, các từ cách nhau một dấu cách.
- Các nhóm in theo thứ tự xuất hiện của từ đầu tiên trong nhóm; trong mỗi nhóm, các từ theo thứ tự xuất hiện.
- Không có nhóm nào thì in
KHONG.
Ràng buộc
- Dòng có ít nhất một từ; dài không quá ~2 \cdot 10^5~ ký tự; mỗi từ dài 1–20 chữ.
Ví dụ
Dữ liệu vào:
nam toi man tram oit mart abc
Kết quả:
nam man
toi oit
tram mart
Giải thích ví dụ
| Từ | Khóa nhóm "".join(sorted(tu)) |
|---|---|
nam, man |
amn |
toi, oit |
iot |
tram, mart |
amrt |
abc |
abc |
Nhóm amn có từ đầu tiên là nam (vị trí 1) nên in trước; nhóm iot bắt đầu ở toi (vị trí 2); nhóm amrt bắt đầu ở tram (vị trí 4). Nhóm abc chỉ có một từ nên không in.
Lưu ý
- Gợi ý của sách:
sorted("nam")là['a', 'm', 'n']; khóa nhóm là chuỗi"".join(sorted(tu)). Không dùng thẳng list làm khóa (list không bất biến, báoTypeError). - Khóa phải giữ cả số lần mỗi chữ:
sorted(set(tu))hay tổng mãord()đều gom nhầm. - Có thể có hàng chục nghìn từ: gom nhóm bằng dict (mục 8.2); so từng cặp từ sẽ quá chậm.
Nguồn: Bài C8-11, mục 8.9, giáo trình Lập trình cơ sở với Python — TS. Nguyễn Quốc Long.
Nguồn trong sách: bài tập C8-11 (mục 8.9) · Mức: (****)