Có nhiều cách để đảo ngược chuỗi trong C/C++, từ viết thủ công đến dùng thư viện chuẩn. Dưới đây là các phương pháp phổ biến.
1. Viết hàm tự định nghĩa (Hoán đổi hai đầu)
Độ phức tạp O(n), không gian O(1).
#include <bits/stdc++.h>
using namespace std;
void reverse_str(string& str) {
int n = str.length();
for (int i = 0; i < n / 2; i++)
swap(str[i], str[n - i - 1]);
}
int main() {
string str = "tutorialspoint";
reverse_str(str);
cout << str; // tniopslairotut
return 0;
}
2. Dùng std::reverse từ <algorithm>
Cách tiêu chuẩn, ngắn gọn, hiệu quả.
#include <bits/stdc++.h>
using namespace std;
int main() {
string str = "tutorialspoint";
reverse(str.begin(), str.end());
cout << str; // tniopslairotut
return 0;
}
3. In ngược chuỗi (không sửa đổi chuỗi gốc)
#include <bits/stdc++.h>
using namespace std;
void print_reverse(const string& str) {
for (int i = str.length() - 1; i >= 0; i--)
cout << str[i];
}
int main() {
string s = "tutorialspoint";
print_reverse(s); // tniopslairotut
return 0;
}
4. Dùng constructor của string (C++11)
string reversed(str.rbegin(), str.rend());
5. Đệ quy (chỉ để minh họa, không khuyến khích dùng thực tế)
void reverse_recursive(string& s, int l, int r) {
if (l >= r) return;
swap(s[l], s[r]);
reverse_recursive(s, l+1, r-1);
}
6. Với C-style string (char*)
#include <cstring>
#include <iostream>
using namespace std;
void reverse_cstring(char* str) {
if (!str) return;
char* end = str + strlen(str) - 1;
while (str < end) {
swap(*str, *end);
str++; end--;
}
}
int main() {
char s[] = "tutorialspoint";
reverse_cstring(s);
cout << s; // tniopslairotut
return 0;
}
So sánh
| Phương pháp | Ưu điểm | Nhược điểm |
|---|---|---|
| Viết tay (swap) | Hiểu bản chất, không phụ thuộc thư viện | Dễ sai index, dài code |
std::reverse | Chuẩn, tối ưu, an toàn, generic | Cần include <algorithm> |
| Constructor rbegin/rend | Ngắn gọn, expressive | Tạo bản sao (tốn O(n) bộ nhớ) |
| In ngược | Không sửa chuỗi gốc | Chỉ để hiển thị |
Kết quả chung
tniopslairotut
Khuyến nghị
Dùng std::reverse(str.begin(), str.end()) cho code production. Nó hoạt động với mọi container có bidirectional iterator (vector, deque, list, string...).