字串的全排列和全組合
阿新 • • 發佈:2019-01-12
全排列:
- 主要思想:將字串第一個字元依次與後面字元交換,然後進行遞迴交換
在存在重複字元時需要加一個判斷,判斷之前是否交換過此字元。
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;
}
}