字典序與next permutation

2021-06-22 05:46:53 字數 764 閱讀 3993

求字典序的直觀方法就是從後往前不斷操作,讓乙個串越來越大,next_permutation中給出了求字典序的方法,這個方法是:

1、如果串是完全逆序的,它不能再大了(但仍把它反轉,使其成為最小串)。2、如果串沒有完全逆序,它就還能變大,怎麼變大呢?如果最後兩個元素是順序的,把它們逆序這個串就變大了;如果最後兩個元素是逆序的,那麼串的尾部就有乙個逆序子串,把這個逆序子串做某操作就可以。什麼是「某操作」呢?

因為子串是逆序的,從後往前它會變得越來越大的,這樣子串很高興,但既然整個串不是完全逆序,那從後往前子串就會遇到乙個小的數x,這樣就不能再繼續變大了。子串很生氣,它要教訓x,因為x是個小數,逆序列中就有乙個成員可以和x交換同時保證整個子列仍是逆序的,這個成員就是子列中第乙個比x大的數y,這樣y強迫x與它交換位置。交換之後我們看整個串一定是變大了,因為x位置的那個數變大了。交換之後子串很高興,它翻了個身,變成順序的了。既然變成順序的,那光看子串的話,子串一定是變小了,同時整個串變大了(變大的幅度盡量小,在子串大的過x的成員中,y就最小)。這就是「某操作」。

這樣我們寫乙個next_permutation

void nextpermutation(vector&v)

// v is not sorted,

for(j=v.size()-1; j>=i; --j)

if(v[j]>v[i-1]) break;

swap(v[i-1],v[j]);

reverse(v.begin()+i,v.end());

}

子集生成與字典序

題目描述 請編寫乙個方法,返回某集合的所有非空子集。給定乙個int陣列a和陣列的大小int n,請返回a的所有非空子集。保證a的元素個數小於等於20,且元素互異。各子集內部從大到小排序,子集之間字典逆序排序,見樣例。測試樣例 123,456,789 返回 當陣列內的元素是字典序排列,則生成子集時用位...

字典序問題 遞迴與分治

1.何謂字典序?我們拿3個數 1,2,3 來講述。字典序值01 2345 排列123 132213 231312 321 3個數的全排列情況有有3 種情況,字典序即從小到大的順序。按字典序給所有的情況從小到大排列,最小的設字典序值為0。字典序問題是,隨意給出乙個序列,要求求出該序列的字典序值。比如說...

字典序演算法

字典序排列就是按照字典a z,1 9的順序給出字串的順序全排列,例如abc的全排列就是從abc一直排到cba。那麼給定乙個字串,怎麼找出恰好大於該字串的下乙個排列呢?我們考慮如下的步驟 1 假設字串為p1 p2 pn 我們從後往前尋找第乙個符合pj j 1條件的字元pj 也就是說,p1 p2 pj ...