Hướng dẫn giải của Tìm ký tự không lặp
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Tác giả:
``` // Tìm ký tự không lặp đầu tiên #include <iostream> #include <unordered_map> using namespace std; int main() { string s; cin >> s; unordered_map<char, int> freq; for (char c : s) freq[c]++; for (char c : s) { if (freq[c] == 1) { cout << c; return 0; } } cout << -1; return 0; }
- Phần khai báo thư viện
include <iostream>
include <unordered_map>
using namespace std;
include <iostream>: Thư viện cung cấp các hàm để nhập xuất dữ liệu (cin, cout).
include <unordered_map>: Thư viện cung cấp cấu trúc dữ liệu unordered_map để lưu trữ và tra cứu cặp khóa-giá trị (key-value) một cách hiệu quả.
using namespace std;: Giúp sử dụng các thành phần trong không gian tên std mà không cần viết std:: trước mỗi lệnh.
- Phần khai báo biến
int main() { string s; cin >> s; unorderedmap<char, int> freq; string s;: Biến s để lưu trữ chuỗi nhập vào từ người dùng. cin >> s;: Nhận chuỗi s từ người dùng. unorderedmap<char, int> freq;: Tạo một bản đồ (map) có khóa là char (ký tự) và giá trị là int (số lần xuất hiện của ký tự đó).
- Vòng lặp đếm tần suất các ký tự cpp Sao chép mã for (char c : s) freq[c]++; for (char c : s): Duyệt qua từng ký tự c trong chuỗi s. freq[c]++: Tăng giá trị của khóa c trong bản đồ freq. Nếu c xuất hiện lần đầu, freq[c] sẽ tự động được khởi tạo bằng 0 (tính năng mặc định của unordered_map) trước khi tăng lên 1. Kết quả: Bản đồ freq lưu trữ tần suất xuất hiện của mỗi ký tự trong chuỗi.
- Vòng lặp tìm ký tự không lặp đầu tiên
for (char c : s) { if (freq[c] == 1) { cout << c; return 0; } } for (char c : s): Duyệt lại từng ký tự c trong chuỗi s. if (freq[c] == 1): Kiểm tra xem tần suất xuất hiện của c trong freq có bằng 1 hay không. Nếu có, c là ký tự không lặp đầu tiên. cout << c;: In ký tự c ra màn hình. return 0;: Kết thúc chương trình ngay sau khi tìm được ký tự không lặp đầu tiên.
- Trường hợp không tìm thấy ký tự không lặp
cout << -1; return 0; Nếu không có ký tự nào có tần suất bằng 1 (tức là không có ký tự không lặp), chương trình in ra -1 để báo hiệu. Hoạt động tổng thể Nhập một chuỗi s từ người dùng. Dùng unordered_map để lưu tần suất xuất hiện của từng ký tự trong chuỗi. Duyệt lại chuỗi để tìm ký tự đầu tiên có tần suất bằng 1. Nếu tìm được, in ký tự đó và kết thúc chương trình. Nếu không tìm thấy, in -1. Ví dụ minh họa Đầu vào:
swiss Quá trình thực hiện:
Đếm tần suất ký tự: perl
freq['s'] = 3 freq['w'] = 1 freq['i'] = 1 Tìm ký tự không lặp đầu tiên: s xuất hiện 3 lần → bỏ qua. w xuất hiện 1 lần → in ra w và kết thúc. Đầu ra:
w
Bình luận