Hướng dẫn giải của Thơ Haiku
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.
Lời giải này đang bị ẩn cho đến khi bạn chọn mở ra.
Chúng tôi khuyên bạn nên tự thử giải bài trước. Việc mở lời giải có thể làm lộ mất ý tưởng chính trước khi bạn có cơ hội tự giải.
Bạn phải đăng nhập để mở lời giải này.
Đăng nhậpTác giả: , , ,
Hiểu bài toán
Bài toán yêu cầu nhập một chuỗi s có độ dài cố định là 19 ký tự, có cấu trúc dạng [5 ký tự],[7 ký tự],[5 ký tự]. Nhiệm vụ là chuyển đổi chuỗi này bằng cách thay thế tất cả các dấu phẩy (,) thành dấu cách () và in ra kết quả. Ví dụ,输入 'happy,newyear,enjoy' (19 ký tự) sẽ cho output 'happy newyear enjoy'.
Các cách tiếp cận
Cách Duyệt và In Ngay (Streaming)
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cin >> s;
for (char c : s) {
if (c == ',') cout << ' ';
else cout << c;
}
cout << endl;
return 0;
}
- Time Complexity: O(N)
- Space Complexity: O(1)
Đây là cách tiếp cận đơn giản và hiệu quả nhất. Chúng ta đọc chuỗi đầu vào, duyệt qua từng ký tự. Nếu ký tự đó là dấu phẩy, ta in ra dấu cách; ngược lại, ta in ra ký tự đó. Phương pháp này không cần lưu trữ thêm chuỗi kết quả mà in trực tiếp ra output, tối ưu cả về thời gian và bộ nhớ.
Cách Thay thế Xâu (String Replacement)
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string s;
getline(cin, s);
for (char &c : s) {
if (c == ',') c = ' ';
}
cout << s << endl;
return 0;
}
- Time Complexity: O(N)
- Space Complexity: O(N)
Cách này sử dụng getline để đọc toàn bộ dòng đầu vào. Sau đó, ta duyệt qua chuỗi và thay đổi trực tiếp các ký tự dấu phẩy thành dấu cách ngay tại chỗ (in-place). Cuối cùng in ra chuỗi đã sửa đổi. Phương pháp này dễ hiểu nhưng yêu cầu lưu trữ chuỗi đầy đủ trong bộ nhớ.
Cách Duyệt và Xây dựng Chuỗi Mới (Builder Pattern)
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
string s;
getline(cin, s);
vector<char> v;
for (char c : s) {
if (c == ',') v.push_back(' ');
else v.push_back(c);
}
for (char c : v) cout << c;
return 0;
}
- Time Complexity: O(N)
- Space Complexity: O(N)
Cách này đọc chuỗi vào, duyệt qua từng ký tự và lưu vào một vector (hoặc chuỗi mới) ký tự đã được xử lý. Sau đó in ra chuỗi mới này. Đây là cách tiếp cận tổng quát hóa logic "xây dựng kết quả" nhưng tốn bộ nhớ hơn so với việc in trực tiếp.
Phân tích độ phức tạp
| Cách tiếp cận | Time | Space | Tên |
|---|---|---|---|
| 1 | O(N) | O(1) | Duyệt và In Ngay (Streaming) |
| 2 | O(N) | O(N) | Thay thế Xâu (String Replacement) |
| 3 | O(N) | O(N) | Duyệt và Xây dựng Chuỗi Mới (Builder Pattern) |
Bài học kinh nghiệm
- Độ dài chuỗi đầu vào luôn là 19 và có cấu trúc định sẵn, nhưng thuật toán không cần kiểm tra độ dài này mà chỉ cần xử lý logic thay thế.
- Thao tác thay thế ký tự ',' thành ' ' là trọng tâm của bài toán.
- Có thể xử lý trực tiếp trên input stream hoặc sửa đổi trực tiếp chuỗi.
Lỗi thường gặp
- Sử dụng
cin >> sthay vìgetlinecó thể gây lỗi nếu chuỗi đầu vào chứa khoảng trắng (dù trong bài này không có, nhưnggetlinean toàn hơn cho các bài tổng quát). - Quên in ký tự khác dấu phẩy khi duyệt.
- Xử lý thừa dấu cách ở cuối chuỗi (không áp dụng ở đây do đầu vào chuẩn).
Bình luận