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

In tất cả tổ hợp ký tự chuỗi theo thứ tự từ điển trong C++


Cho chuỗi str, in tất cả tổ hợp ký tự theo thứ tự từ điển (lexicographical).

Input: str = 'XYZ' Output: X XY XYZ XZ XZY Y YX YXZ YZ YZX Z ZX ZXY ZY ZYX

Giải pháp: Dùng map đếm tần suất ký tự. Backtracking (quay lui) để sinh tổ hợp.

Chương trình minh họa

#include <bits/stdc++.h>
using namespace std;
void printResult(char* result, int len);
void findstringCombination(char result[], char str[], int count[], int level, int size, int length);
void printCharCombination(string str);
int main(){
    string str = "ABC";
    cout << "Tổ hợp ký tự chuỗi :\n";
    printCharCombination(str);
    return 0;
}
void findstringCombination(char result[], char str[], int count[], int level, int size, int length){
    if (level == size) return;
    for (int i = 0; i < length; i++) {
        if (count[i] == 0) continue;
        count[i]--;
        result[level] = str[i];
        printResult(result, level);
        findstringCombination(result, str, count, level + 1, size, length);
        count[i]++;
    }
}
void printCharCombination(string str){
    map<char, int> mp;
    for (int i = 0; i < str.size(); i++) {
        if (mp.find(str[i]) != mp.end())
            mp[str[i]] = mp[str[i]] + 1;
        else
            mp[str[i]] = 1;
    }
    char* input = new char[mp.size()];
    int* count = new int[mp.size()];
    char* result = new char[str.size()];
    map<char, int>::iterator it = mp.begin();
    int i = 0;
    for (it; it != mp.end(); it++) {
        input[i] = it->first;
        count[i] = it->second;
        i++;
    }
    int length = mp.size();
    int size = str.size();
    findstringCombination(result, input, count, 0, size, length);
}
void printResult(char* result, int len){
    for (int i = 0; i <= len; i++)
        cout << result[i];
    cout << endl;
}

Kết quả

A AB ABC AC ACB B BA BAC BC BCA C CA CAB CB CBA