字典次序:所謂字典次序指兩序列的元素一 一比較直至出現下列情況:
如果兩元素不相等,那麼這兩個元素的比較結果就是整個序列的比較結果;
如果兩個序列的元素數量不同,則元素較少的序列小於另乙個序列;
如果兩個序列沒有更多可以比較的元素,則兩個序列相等。
通俗來講就是 str1 < str2 等價於str1的前k-1個元素與str2的前k-1個元素相等,但str1的第k個元素小於str2的第k個元素,或者str1的元素個數小於str2的元素個數。
全排列:對於乙個含有n個元素的序列,按照一定次序對序列元素進行排列。那麼全排列數為n!。
比如序列的全排列方式共有3!= 6個,分別為,,,,,,這就是乙個字典次序的全排列。
1.標頭檔案
#include
2.函式原型
一般求乙個序列的全排列會要求按照字典次序進行排列,那麼有必要介紹一下接下來的幾個概念:
bool
next_permutation
(begin, end)
// 函式會改變[begin,end)區間內元素次序,使它們符合"下一次排列次序",預設為按字典次序公升序
bool
next_permutation
(begin, end, op)
// op為自定義排列次序
bool
prev_permutation
(begin, end)
// 函式會改變[begin,end)區間內元素次序,使它們符合"上一次排列次序",預設為按字典次序公升序
bool
prev_permutation
(begin, end, op)
// op為自定義排列次序
詳細說明:
1.next_permutation(begin, end, op )
功能:求當前序列的「下一次排序」,函式值為bool型別,若當前序列不存在下一次排序,返回false;若存在,則返回true,並且改變區間 [begin,end) 的元素次序使之符合「下一次排序」
引數:
常用形式為 next_permutation (array, array + size),可以通過設定begin與end的值使之只對序列的子串行進行排列
2.prev_permutation(begin, end, op)
功能求當前序列的「上一次排序」,函式值為bool型別,若當前序列不存在上一次排序,返回false;若存在,則返回true,並且改變區間 [begin,end) 的元素次序使之符合「上一次排序」
引數:
常用形式為 prev_permutation (array, array + size),可以通過設定begin與end的值使之只對序列的子串行進行排列
若要實現全排列,首先必須要對初始序列進行排序,使之成為字典次序中的第乙個排列方式或最後乙個排列方式,否則next_permutation() 函式和prev_permutation() 函式只能給出當前序列的下乙個或上乙個。
1.按照字典次序輸出給定字串的全部排列方式
#include
#include
#include
using
namespace std;
const
int maxn =6;
char arr[maxn]
;int main ()
cout << endl;
}return0;
}例:輸入:abc
輸出:abc acb bac bca cab cba // 偷懶~~未換行
2.按照字典次序的逆序輸出給定字串的全部排列方式
#include
#include
#include
using
namespace std;
const
int maxn =6;
char arr[maxn]
;bool compare (
char a,
char b)
int main ()
cout << endl;
}return0;
}例:輸入:abc
輸出:cba cab bca bac acb abc // 偷懶~~未換行
3.未對初始序列排序,依次求下一次排列
#include
#include
#include
using
namespace std;
const
int maxn =6;
char arr[maxn]
;int main ()
cout << endl;
}return0;
}例:輸入:bac
輸出:bac bca cab cba // 偷懶~~未換行
4.未對初始序列排序,依次求上一次排列
#include
#include
#include
using
namespace std;
const
int maxn =6;
char arr[maxn]
;int main ()
cout << endl;
}return0;
}例:輸入:bac
輸出:bac acb abc // 偷懶~~未換行
5.利用自定義排序方式,和 next_permutation 實現字典次序逆序
#include
#include
#include
using
namespace std;
bool compare (
char a,
char b)
int main ();
cout << arr << endl;
while
(next_permutation
(arr, arr +
strlen
(arr)
, compare))
cout << endl;
return0;
}結果依次為:
cbacab
bcabac
acbabc
6.利用自定義排序方式,和 prev_permutation 實現字典次序
#include
#include
#include
using
namespace std;
bool compare (
char a,
char b)
int main ();
cout << arr << endl;
while
(prev_permutation
(arr, arr +
strlen
(arr)
, compare))
cout << endl;
return0;
}結果依次為:
abcacb
bacbca
cabcba
7.對序列的子串行進行排列
#include
#include
#include
using
namespace std;
int main ();
cout << arr << endl;
while
(next_permutation
(arr, arr +3)
) cout << endl;
return0;
}結果依次為:
abcde
acbde
bacde
bcade
cabde
cbade
C 標準庫函式之排列函式
字典次序 所謂字典次序指兩序列的元素一 一比較直至出現下列情況 如果兩元素不相等,那麼這兩個元素的比較結果就是整個序列的比較結果 如果兩個序列的元素數量不同,則元素較少的序列小於另乙個序列 如果兩個序列沒有更多可以比較的元素,則兩個序列相等。通俗來講就是 str1 str2 等價於str1的前k 1...
庫函式求全排列
上級排列 prev permutation start,end 求的是當前排列的上乙個排列 對於 上乙個 和 下乙個 它們為字典序的前後,就是對於當前序列pn,他的下乙個序列pn 1,不存在另外的pm,使得pn字典序 不同排列的先後關係是從左 右逐個比較對應的數字的先後來決定的。例如 對於6個數字的...
標準庫函式實現之strstr
昨天去參加乙個面試,發現自己的 水平還是不夠,謝了兩次才寫出來,連基本的標準庫實現,都沒法做好,遂決定對標準庫中的部分函式的實現研習一番。面試的是 char strstr char s1 char s2 函式,自己寫的就不說了,寫得很爛,不過看了minix 裡面的實現思路和我一樣,linux的 中,...