1. 程式人生 > >字串的全排列和全組合

字串的全排列和全組合

全排列:

  • 主要思想:將字串第一個字元依次與後面字元交換,然後進行遞迴交換
    在存在重複字元時需要加一個判斷,判斷之前是否交換過此字元。
bool isSwap(string str, int begin, int end) {
    for (int i = begin; i < end; i++) {
        if (str[i] == str[end])
            return false;
    }
    return true;
}
void fullArrangement(string str, int l, int
r) { if (l == r) { cout << str << endl; } else { for (int i = l; i <= r; i++) { if (isSwap(str, l, i)) { swap(str[l], str[i]); fullArrangement(str, l + 1, r); swap(str[l], str[i]); } } } }

全組合:

  • 主要思想:同樣可以利用全排列的思想,但是更簡單的方法是位操作。在存在重複字元時需要有一個去重的操作。
string dropDuplicates(string str) { // 去重操作
    string res;
    int len = str.size();
    int hash[256] = { 0 };
    for (int i = 0; i < len; i++) {
        hash[str[i]] |= 1;

    }
    for (int i = 0; i < 256; i++) {
        if
(hash[i] == 1) { res += char(i); } } return res; } void fullCombination(string str, int l, int r) { int len = str.size(); int n = 1 << len; for (int i = 1; i <= n; i++) { for (int j = 0; j < len; j++) { if (i & (1 << j)) cout << str[j]; } cout << endl; } }