Hướng giải của Chuẩn hóa họ tên
Nhớ rằng hướng dẫn giải này chỉ nên sử dụng khi bế tắc, và tuyệt đối không nên sao chép mã nguồn kèm theo. Hãy tôn trọng tác giả bài tập và người viết hướng dẫn giải.
Nộp mã nguồn lời giải chính thức trước khi giải bài tập đó có thể khiến bạn bị ban.
Nộp mã nguồn lời giải chính thức trước khi giải bài tập đó có thể khiến bạn bị ban.
Tác giả:
Lời giải: Chuẩn hóa họ tên
Phân tích
Đọc cả dòng bằng getline, bỏ khoảng trắng đầu cuối, chuẩn hóa khoảng trắng giữa các từ, viết hoa chữ cái đầu mỗi từ và các chữ còn lại viết thường.
Độ phức tạp
- Thời gian: O(N)
- Không gian: O(N)
Code mẫu C++
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
getline(cin, s); // Đọc cả dòng có khoảng trắng
// Bỏ khoảng trắng thừa ở đầu
while (!s.empty() && s[0] == ' ') s.erase(0, 1);
// Bỏ khoảng trắng thừa ở cuối
while (!s.empty() && s.back() == ' ') s.pop_back();
string res = "";
bool first = true;
string word;
stringstream ss(s); // Dùng stringstream để tách từ
while (ss >> word) { // Tự động bỏ khoảng trắng thừa giữa các từ
if (!first) res += ' '; // Thêm khoảng trắng phân cách
first = false;
// Viết hoa chữ cái đầu mỗi từ
word[0] = toupper(word[0]);
// Các chữ còn lại viết thường
for (int i = 1; i < (int)word.size(); i++) {
word[i] = tolower(word[i]);
}
res += word;
}
cout << res << endl;
return 0;
}
Giải thích
stringstreamgiúp tách xâu thành các từ, tự động xử lý nhiều dấu cách liên tiếp.touppervàtolowertừ thư viện<cctype>để chuyển đổi chữ hoa/thường.- Biến
firstgiúp quản lý việc thêm khoảng trắng phân cách giữa các từ.
Nhận xét