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

Sắp xếp ký tự tạo palindrome nếu có thể trong C++


Cho chuỗi 'str' độ dài bất kỳ. Nhiệm vụ: sắp xếp lại ký tự thành chuỗi palindrome nếu có thể, không thêm/xóa ký tự. Palindrome: đọc từ đầu và cuối giống nhau.

Các trường hợp đầu vào/đầu ra

Đầu vào - string str = "itnin"

Đầu ra - Sắp xếp ký tự tạo palindrome: nitin

Giải thích - Sắp xếp "itnin" thành "nitin" (palindrome).

Đầu vào - string str = "baaaba"

Đầu ra - Sắp xếp ký tự tạo palindrome: aabbaa

Giải thích - Sắp xếp "baaaba" thành "aabbaa" (palindrome).

Phương pháp sử dụng trong chương trình dưới đây

  • Nhập chuỗi str, tính length.

  • Gọi Rearrangement(str, length).

  • Trong hàm Rearrangement:

    • unordered_map um đếm tần suất ký tự.

    • int total=0 đếm ký tự xuất hiện số lần lẻ.

    • char ch lưu ký tự lẻ (nếu có).

    • string str1, str2 xây dựng nửa đầu và nửa sau.

    • Duyệt str: um[str[i]]++.

    • Duyệt um: nếu it.second%2!=0 → total++, ch=it.first.

    • Nếu total>1 hoặc (total==1 và length chẵn) → trả về 0 (không thể).

    • Duyệt um: tạo chuỗi it.second/2 lần it.first, str1 += chuỗi, str2 = chuỗi + str2.

    • Nếu total==1 trả về str1 + ch + str2, ngược lại str1 + str2.

  • In kết quả.

Ví dụ mã

#include <bits/stdc++.h> using namespace std; string Rearrangement(string str, int length){    unordered_map<char, int> um;    int total = 0;    char ch;    string str_1 = "";    string str_2 = "";    for (int i = 0; i < length; i++){       um[str[i]]++;    }    for(auto it : um){       if(it.second % 2 != 0){          total++;          ch = it.first;       }    }    if(total > 1 || total == 1 && length % 2 == 0){       return 0;    }    for(auto it : um){       string str(it.second / 2, it.first);       str_1 = str_1 + str;       str_2 = str + str_2;    }    if(total == 1){       return str_1 + ch + str_2;    }    else{       return str_1 + str_2;    } } int main(){    string str = "itnin";    int length = str.size();    cout<<"Sắp xếp ký tự tạo palindrome nếu có thể: "<<Rearrangement(str, length);    return 0; }

Đầu ra

Nếu chạy mã trên sẽ cho kết quả:

Sắp xếp ký tự tạo palindrome nếu có thể: nitin