字串的全排列是面試中相對而言必要重要的演算法,有兩種實現方法:遞迴,非遞迴
替換點:從字串的最後一位開始,找到第乙個逆序的字串,如「54312」那麼從後向前第乙個逆序為12,那個1就是替換值,替換值得位置就是替換點。
非遞迴演算法思想:
對於乙個字串4231,這個字串中排列組合中1234是最小的數,4321是最大的數,上面的演算法步驟就是輸出從1234-4321的乙個有序陣列佇列。
#include
#include
#include
#include
#include
bool find_replace_pos(const
std::string& str, size_t& rp, size_t& min_max) else }}
}if (min_max != std::string::npos)
if (rp == 0)
--rp;
}return
false;
}void swap(std::string& str, size_t from, size_t to)
std::string::value_type tmp = str.at(from);
str[from] = str.at(to);
str[to] = tmp;
}void reverse(std::string& str, size_t start, size_t end)
}void permutation(std::string str, std::vector
& ret)
size_t end = str.size() - 1;
size_t rp = std::string::npos;
size_t min_max = std::string::npos;
std::sort(str.begin(), str.end());
ret.push_back(str);
while (find_replace_pos(str, rp, min_max))
}int main()
std::cout
<< "ret size:"
<< ret.size() << std::endl;
return
0;}
遞迴演算法思想:
乙個字串有n個字串,那個全排列的定義本身就是乙個遞迴定義(在不考慮重複字元時),n個字元一次固定在首位排列組合*剩餘n-1個字串的排列組合。
#include
#include
#include
#include
#include
void swap(std::string& str, size_t from, size_t to)
std::string::value_type tmp = str.at(from);
str[from] = str.at(to);
str[to] = tmp;
}// 遞迴方法
// permutation(n)
void permutation(std::string& str, size_t start, size_t end, std::vector
& ret)
for (size_t index = start; index < end; ++index)
}int main()
std::cout
<< "ret size:"
<< ret.size() << std::endl;
return
0;}
字串全排列 非遞迴實現
乙個演算法命題 給定字串s 0 n 1 設計演算法,列舉s的全排列。如 123,全排列就是 123,132,213,231,312,321 由123的全排列 123,132,213,231,312,321可知,這個全排列大小是有序的。也就是說,從最小的開始排列,每次只找比當前排列大一點的序列即可,這...
字串的全排列詳解,遞迴 非遞迴
輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba 首先,我們固定第乙個字元a,求後面兩個字元bc的排列 當兩個字元bc排列求好之後,我們把第乙個字元a和後面的b交換,得到bac,接著我們固定第乙...
全排列 非遞迴
description 列出所有數字1到數字n的連續自然數的排列,要求所產生的任一數字序列中不允許出現得復數字。input 輸入 n 1 n 9 output 由1 n組成的所有不重複的數字序列,每行乙個序列。sample input 3 sample output 1 2 3 1 3 2 2 1 ...