碰到過很多求關於字典序的問題,一直都是用的c++的stl庫中的函式水過的,今天終於有機會,算是對字串字典序問題的乙個總結吧。
如果已知乙個字串「abc」,為了更直觀,我們把建立如下對映:
a->1我們把這三個字母的所有排列都寫出來,有:b->2
c->3
序號字串
對映數字
1abc
1232
acb132
3bac
2134
bca231
5cab
3126
cba321
如上,我們會發現,我們最後對映出相應的數字結果是從小到大排列的。而我們上面的排列順序,顧名思義,就像字母在字典裡的排列順序一樣,所以就被叫做按字典序排列。
事實上我們如果已知一串字串,是有辦法直接根據它求出下乙個字典序的,下面我們將要介紹最簡單的求下乙個字串的方法。
假設我們已知一字串 s =「bac」:
**如下:
@frosero
//求下乙個字典序
#include
#include
#include
using
namespace
std;
bool next_permutation(string &s)
}if(small == -1) return
false;
big = small + 1;
for(string::size_type i = small + 1;i//第二步
if(s[i] > s[small] && s[i] < s[big]) big = i;
}swap(s[small],s[big]);
for(string::size_type i = small + 1;i < s.size();i++)
}return
true;
}int main()
上訴方法雖然給了我們乙個求乙個字典序的樸素方法,但是在某些情況下並不適用。
比如我們要準確找到第n個字典序的排列是什麼的時候,我們不可能傻傻的乙個個的序列數過去。就算是乙個長度為20的無重複字元的序列,它的排列方式也有20!即2432902008176640000種!!估計數完以後我們都老了 = =。
怎麼辦呢,其實我們有非常快的方法直接求得,這就要用到我們曾經學過的排列組合,我們思想是逐步確定每一位應該是什麼。
直接上**:
@frosero
//快速定位第n字典序演算法
#include
#include
#include
using
namespace
std;
inline
long
long mulcal(long
long n)
void kth_permutation(string &s,long
long n)
now = mulcal(alps); //根據排列組合求此時剩餘字元的不同排列數
for(int k = 0;k < 27;k++)if(alp_cnt[k])
if(sum + now >= n)
sum += now;}}
}int main()
我們還存在一些問題用上訴方法很難解決
詳情請走傳送門:萌萌噠請點我~@frosero
字典序問題
字典序問題,給定乙個長度不超過6的小寫字母公升序字串 字串中的字元相對順序和字母表中的順序一致 迅速計算出在字典中的編碼,字典如 1 2 3 26 27 28 a b c z ab ac 總體思路為先計算出給定字串前所有的個數,然後再加一 include include 計算從i開始的長度為k的所有...
字典序問題
在資料加密和資料壓縮中需要對特殊的字串進行編碼。給定的字母表由26個小寫字母組成。該字母表產生的公升序字串是指字串中字母從左到右出現的次序與字母在字母表中出現的次序相同,且每個字元最多出現1次。例如,a,b,ab,bc,xyz等都是公升序字串。現在對字母表中產生的所有長度不超過6的公升序字串按照字典...
字典序問題
字典序問題。在資料加密和資料壓縮中常需要對特殊的字串進行編碼。給定的字母表a由26個小寫字母組成。該字母表產生的公升序字串中字母 從左到右出現的次序與字母在字母表中出現的次序相同,且每個字元最多出現1次。例如,a,b,ab,bc,xyz等字串都是公升序字串。現在對字母表中產生的所有長度不超過6的公升...