Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Các phương pháp đảo ngược chuỗi trong C/C++

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ểmNhược điểm
Viết tay (swap)Hiểu bản chất, không phụ thuộc thư việnDễ sai index, dài code
std::reverseChuẩn, tối ưu, an toàn, genericCần include <algorithm>
Constructor rbegin/rendNgắn gọn, expressiveTạo bản sao (tốn O(n) bộ nhớ)
In ngượcKhông sửa chuỗi gốcChỉ để 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...).