字典序問題

2021-07-22 21:20:40 字數 1264 閱讀 9390

在資料加密和資料壓縮中需要對特殊的字串進行編碼。給定的字母表由26個小寫字母組成。該字母表產生的公升序字串是指字串中字母從左到右出現的次序與字母在字母表中出現的次序相同,且每個字元最多出現1次。例如,a,b,ab,bc,xyz等都是公升序字串。

現在對字母表中產生的所有長度不超過6的公升序字串按照字典序排列並編碼如下:

對於任意長度不超過6的公升序字元中,迅速計算出它在上述字典中的編碼。

任務:對於給定的長度不超過6的公升序字串,程式設計計算它在上述字典中的編碼。

解題思路:本題的關鍵之處在於正確理解題目描述中給出的字典序,其關鍵之處在於首先出現長度為1的字串,然後是長度為2的字串、……。而在相同長度的字串中,按照字典序進行。

例如,對字串cfkp這個長度為4的字串來講,如果能夠計算出排在它前面的字串數目,加1就得到該字串的編碼。排列在該字串前的字串可以如下分析:

(1)長度為1的字串、長度為2的字串、長度為3的字串;

(2)在以字母c打頭的長度為4的字串中,以cd、ce打頭、長度為4的字串同樣排列在該字串前面;而在以cf打頭的長度為4的字串中,以cfg、cfh、cfi、cfj打頭的長度為4的字串排列在該字串前面;在以cfk打頭的字串中,以cfkl、cfkm、cfkn、cfko打頭的長度為4的字串同樣在它前面。

對第(2)種情況進行分析,可以分為如下幾種情況:

以cd和ce打頭、長度為4的字串數目與以d、e打頭、長度為3的字串數目相同;

其他情況可以描述為:以g、h、i、j打頭,長度為2的字串數目;

以l、m、n、o打頭、長度為1的字串數目。 分析上述情況,對其中的規律進行總結,需要計算的字串數目可以分為兩類:

(1)長度為k的字串數目,用g(k)表示;

(2)以字元ch打頭,長度為k的字串數目,用f(ch,i)表示。 顯然,有 g(k)=sum_^26 f(ch,k) 同樣,有如下規律可以發現: f(ch,1)=1 f(ch,k)=sum_^26 f(i,k-1) 在此基礎上,可以計算出每個字串的編碼。

//字典序問題

#include

#includeint f(int ch,int len)

int g(int len)

int main()

for(ch=0;chfor(k=1;kfor(ch=str[k-1]-'a'+1;chpos+=f(ch,strlen(str)-k);

printf("位置是:%d\n",pos+1);

return 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的所有...

字典序問題

字典序問題。在資料加密和資料壓縮中常需要對特殊的字串進行編碼。給定的字母表a由26個小寫字母組成。該字母表產生的公升序字串中字母 從左到右出現的次序與字母在字母表中出現的次序相同,且每個字元最多出現1次。例如,a,b,ab,bc,xyz等字串都是公升序字串。現在對字母表中產生的所有長度不超過6的公升...