Bài tập về các thao tác xử lí xâu năm 2024
Bài viết này sẽ tổng hợp các dạng bài tập liên quan đến xử lý xâu trong kỳ thi Tin học trẻ. Bài viết sẽ gồm 2 phần. Các bạn có thể xem thêm phần 2 tại đây! Show
Khái niệm XâuXâu (tiếng anh là String) là một kiểu dữ liệu. Xâu là một dãy các ký tự trong bảng mã ASCII. Hiểu đơn giản, xâu là một chuỗi ký tự bao gồm chữ hoa, chữ thường, số và một số ký tự đặc biệt Lưu ý: chữ ở đây được hiểu là các chữ cái trong bảng chữ cái tiếng anh. Ví dụ về xâu (string): abc123, xin_chao, ToiThichHocLapTrinh! Xâu trong ScratchTrong Scratch, có 2 câu lệnh liên quan đến xử lý xâu: length of … : Câu lênh này sẽ trả về số lượng ký tự có trong xâu. Ví dụ, khi click vào câu lệnh “length of apple” thì câu lệnh này sẽ trả về số 5 vì chữ apple có 5 ký tự letter … of … : Câu lệnh này sẽ giúp lấy ra ký tự ở vị trí nào đó của xâu. Ví dụ, khi click vào câu lệnh “letter 1 of apple” thì câu lệnh này sẽ trả về chữ “a” vì ký tự thứ nhất (chữ cái thứ nhất) trong chuỗi (từ) apple là chữ “a” Bài 1: Xử lý xâu – Đếm ký tự trong xâuNhân vật sẽ yêu cầu người chơi nhập vào một sâu bất kỳ. Sau đó:
Gợi ý hướng giải quyết:
Bài giải:Link project: https://scratch.mit.edu/projects/408533906/ Bài 2: Xóa một loại ký tự nào đó trong xâuNhân vật sẽ yêu cầu người chơi nhập vào một sâu bất kỳ. Chương trình sẽ xóa bỏ mọi ký tự không phải là chữ trong xâu đó. Sau đó nhân vật sẽ thông báo xâu kết quả ra màn hình. Gợi ý hướng giải quyết:Scratch không có câu lệnh xóa một ký tự nào đó trong xâu. Do đó ta sẽ phải tạo ra một biến để lưu xâu mới. Tất cả các ký tự trong xâu cũ thỏa mãn điều kiện sẽ được thêm vào xâu mới. Cụ thể:
Bài giải:Link project: https://scratch.mit.edu/projects/408544408/ Lưu ý: Nếu đề bài cho là xóa ký tự chữ hoặc xóa ký tự đặc biệt thì ta cũng làm tương tự. Hướng làm chung là tìm các ký tự thỏa mãn yêu cầu của đề bài rồi nối vào xâu mới. Bài 3: Xóa ký tự trùng trong xâuNhân vật sẽ yêu cầu người dùng nhập một xâu bất kỳ từ bàn phím. Sau đó, chương trình sẽ kiểm tra nếu thấy có 2 ký tự liền nhau và giống nhau thì xóa đi một ký tự. Ví dụ nhập vào là aaxbbbccccd thì đưa ra kết quả axbcd Gợi ý hướng giải quyết:Bài tập này có ý tưởng giải quyết tương tự như bài 2 – xóa một loại ký tự nào đó trong xâu. Tuy nhiên, thay vì so sánh từng ký tự với danh sách chữ cái và danh sách số thì ta cần so sanh ký tự đang xét với ký tự phía trước nó để xem có trùng không. Nếu không trùng thì ta thêm ký tự đó vào xâu kết quả. Xâu (string) xuất hiện rất nhiều trong các bài toán. Bài viết này giới thiệu sơ qua một số thuật ngữ cũng như thuật toán về xâu. Thuật ngữ
Các dạng bàiSo khớp chuỗi (string matching)Cho một xâu $T$ và xâu $S$. Tìm tất cả các lần xuất hiện của xâu $S$ trong xâu $T$. Ví dụ:
Bài toán này còn được gọi là tìm kiếm cây kim (needle) trong đống rơm (haystack), vì nó xuất hiện trong thực tế khi ta cần tìm một xâu rất nhỏ trong một lượng dữ liệu rất lớn (ví dụ Google cần tìm từ khóa trong hàng tỉ tỉ trang web). Có 3 thuật toán chính để giải quyết bài này, đó là:
Xâu đối xứng (Palindrome)Palindrome hay còn gọi là xâu đối xứng, xâu đối gương là tên gọi của những xâu kí tự mà khi viết từ phải qua trái hay từ trái qua phải thì xâu đó không thay đổi. VD: MADAM, IOI,… Có rất nhiều bài tập liên quan đến xâu đối xứng. Các bạn có thể tìm đọc ở trong các bài viết:
Cấu trúc dữ liệu
Các bài Ad-hocTrong xử lý xâu còn một vài thuật toán chỉ áp dụng được cho 1 bài toán (ad-hoc). Thuật toán ManacherBài toán Cho xâu $S$.
Mô tả thuật toán Tham khảo thêm ở link Code
Minimal string rotationBài toán Cho một xâu $S$. Xét các xâu thu được từ xâu $S$ bằng phép xoay. Ví dụ:
7, thì các xâu thu được từ $S$ bằng phép xoay là:
Tìm xâu có thứ tự từ điển nhỏ nhất. Mô tả thuật toán Bạn có thể xem ở đây Code
Lyndon DecompositionBài toán Lyndon word là các xâu khác rỗng, mà có thứ tự từ điển nhỏ hơn tất cả các xâu thu được bằng phép xoay của nó. |