Chuỗi (string)
Chuỗi (string) thực chất là một mảng của ký tự. Bạn sẽ hiểu tính bất biến (immutable) — đặc điểm gây bất ngờ nhất của chuỗi — và một bẫy hiệu năng kinh điển khi nối chuỗi trong vòng lặp.
1. Trực quan: chuỗi là dãy ký tự có chỉ số
chỉ số: 0 1 2 3 4
┌────┬────┬────┬────┬────┐
s = │ 'H'│ 'e'│ 'l'│ 'l'│ 'o'│ s = "Hello"
└────┴────┴────┴────┴────┘
Mọi thứ học về mảng đều áp cho chuỗi: s[0] là 'H' (O(1)), len(s) là 5, duyệt từng ký tự bằng
vòng lặp. Chuỗi chỉ là mảng mà mỗi ô là một ký tự.
2. Tính BẤT BIẾN (immutable) — điểm khác biệt lớn
Ở nhiều ngôn ngữ (Python, Java, JS), chuỗi không sửa được tại chỗ. Bạn không thể làm
s[0] = 'h'. Mọi "thay đổi" thực chất tạo ra chuỗi MỚI.
Hệ quả: mỗi lần "sửa" chuỗi tốn O(n) (vì tạo bản sao mới). Nhớ điều này — nó dẫn tới bẫy ở mục 4.
3. Chạy debug: đảo ngược chuỗi bằng hai con trỏ
Vì chuỗi giống mảng, nhiều kỹ thuật mảng áp được. Bước qua việc đảo "CODE" thành list rồi hoán
đổi hai đầu (kỹ thuật hai con trỏ sẽ học kỹ ở Trụ 4):
4. Bẫy hiệu năng: nối chuỗi trong vòng lặp
Vì chuỗi bất biến, s += ky_tu trong vòng lặp tạo chuỗi mới mỗi lần → tổng O(n²)! Bấm Run để
so sánh cách sai và cách đúng:
Quy tắc: xây chuỗi lớn → gom các phần vào list rồi "".join(...) một lần. Đừng += chuỗi
trong vòng lặp dài.
5. Các thao tác chuỗi hay dùng
| Thao tác | Ví dụ | Ghi chú |
|---|---|---|
| Truy cập ký tự | s[i] | O(1) |
| Độ dài | len(s) | O(1) |
| Cắt lát | s[2:5] | O(k), tạo chuỗi mới |
| Nối | a + b | O(len a + len b), chuỗi mới |
| Tách | s.split(",") | O(n) |
| Ghép | "".join(ds) | O(tổng độ dài) |
| Kiểm tra chứa | "ab" in s | O(n·m) |
6. Mẫu nhận diện
- Bài toán xử lý văn bản, ký tự, từ → tư duy như mảng ký tự.
- Cần sửa chuỗi nhiều → đổi sang list ký tự, sửa, rồi
joinlại. - Thấy
s += ...trong vòng lặp → cảnh báo O(n²), đổi sang list + join.
7. 🎮 Trò chơi: Hiểu chuỗi
8. Quiz kiểm tra nhanh
9. Hoàn thành
…☑️ Tiếp theo: 2.1.5 — Bài toán chuỗi thường gặp (palindrome, anagram, đếm ký tự).