題目:給定字串s[0...n-1],設計演算法,列舉s的全排列。
假設字串為「1234」,首先考慮1,然後問題就變成了考慮「234」的全排列,所以問題規模縮小了1,然後再考慮2,依次類推。可以採用遞迴演算法。
1-234
2-134
3-124
4-123
假設有重複字元,則重複字元的全排列就是每個字元分別與它後面非重複出現的字元交換。
1 #include 2 #include測試用例為「1234」和「1223」34using
namespace
std; 5
6//遞迴演算法
7void swap(char &c1, char &c2) 8
14//判斷是否交換
15bool isswap(string str,int
from, int
to) 16
26} 27
return
cnt; 28
} 29//
from和to 是下標
30void permutation(string str, int
from, int
to) 31
38 cout <
return;
40} 41
for(int i = from; i <= to; ++i) 42
49return;
50} 51
52int main(int argc, const
char *ar**) 53
結果為:
這裡有個小技巧,可以減少有重複字元全排列的時間複雜度,通過空間換時間。
如果是單字元,可以使用mark[256]。
如果是整數,可以遍歷整數得到最大值max和最小值min,使用mark[max-min+1]。
如果是浮點數或者其他結構資料,用hash(事實上,如果發現整數間變化太大,也應該考慮使用hash;並且,可以認為整數情況是最樸素的hash)
將mark陣列全部賦0,每次交換前將mark[i]賦1,然後每次要進行交換前進行判斷即可。
**只修改這一部分,其餘部分一樣:
40int mark[256];
41for(int i = 0; i < 256; ++i) 42
45for(int i = from; i <= to; ++i) 46
57return;
58 }
字串全排列演算法 遞迴
以字串1234為例 1 一 234 2 一 134 3 一 214 4 一 231 如何才能保證不遺漏呢 如下 includeusing namespace std char str 1234 int size sizeof str sizeof char str 要進行全排列的字元陣列 size ...
遞迴 字串全排列 全排列
在高中階段我們已經通過大量的習題了解了排列和組合。但是有時候我們研究的不是由排列和組合算出來的數字,研究的是生成排列和組合。即,把集合中元素所有的排列和組合全部列出來,然後研究這些序列的性質。今天我用兩種方法講一下如何生成排列。注意我們這裡涉及的順序都是序列的字典序。序列的字典序 設有兩個序列,第乙...
字串的全排列 遞迴演算法訓練
前幾天,師兄輕描淡寫的出了一道題,對於乙個給定的字串,輸出它的全排列結果,例如,輸入ab,則程式需要輸出ab,ba 結果數為2 1 2 額外的要求是對於字串中的重複字元,程式要能識別出來並進行去重處理,例如,輸入aab,則程式需要輸出baa,aba,aab 結果數為3,而不是3 2 6 這裡我用了兩...