遞迴 字典序問題

2021-06-19 20:24:59 字數 1468 閱讀 7279

比較經典的問題

描述

在資料加密和資料壓縮中常需要對特殊的字串進行編碼,給定的字母表a由26個小寫英文本母組成a=

。該字母表產生的公升序字串是指字串中字母從左到右出現的次序與字母在字母表中出現的次序相同,且每乙個字元最多出現

1次。例如,

a,b,ab,bc,xyz

等字串都是公升序字串。現在對字母表

a產生的所有長度不超過

6的公升序字串按照字典序並編碼如下:

1  2  ... 26  27  28  ...

a  b  ...  z  ab  ac  ...

對於任意長度不超過

6的公升序字串,程式設計計算出它在上述字典中的編碼。

輸入

輸入的第1行是乙個正整數k,表示接下來共有k行。在接下來的k行中,每行給出乙個字串。

輸出

輸出共有k行,每行對應乙個字串的編碼。

樣例輸入2

ab樣例輸出1

2關鍵函式共有兩個:

/計算以i開始的長度為k的所有數的個數,前提是公升序

int f(int i,int k)

}return sum;

}

//計算長度為k的所有組合的個數,前提是公升序

int g(int k)

return sum;

}

通過這兩個函式,就可以得到乙個字串的字典序:

以字串s:bdfg為例。

1 計算長度小於4的所有字串個數,這些字串都會排在s之前。

2 計算長度為4,首字母小於b的字串個數

3 計算長度為3,首字母大於b,小於d的字串個數。。。。直至長度為一

4 return 以上數字之和+1 即是當前字母的字典序:

#include#includeusing namespace std;

//計算以i開始的長度為k的所有數的個數,前提是公升序

int f(int i,int k)

}return sum;

}//計算長度為k的所有組合的個數,前提是公升序

int g(int k)

return sum;

} //轉換成數字

int change(char c)

//給出乙個字串返回乙個序號

int order(string s)

{ int i;

int k=s.size();

int sum=0,temp=0;

//獲取1~k-1長度的子字串數

for( i=1;i>n;

while(n--)

{string s;

cin>>s;

cout<

字典序問題 遞迴與分治

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

字典序問題

碰到過很多求關於字典序的問題,一直都是用的c 的stl庫中的函式水過的,今天終於有機會,算是對字串字典序問題的乙個總結吧。如果已知乙個字串 abc 為了更直觀,我們把建立如下對映 a 1 b 2 c 3 我們把這三個字母的所有排列都寫出來,有 序號字串 對映數字 1abc 1232 acb132 3...

字典序問題

字典序問題,給定乙個長度不超過6的小寫字母公升序字串 字串中的字元相對順序和字母表中的順序一致 迅速計算出在字典中的編碼,字典如 1 2 3 26 27 28 a b c z ab ac 總體思路為先計算出給定字串前所有的個數,然後再加一 include include 計算從i開始的長度為k的所有...