字典序問題

2021-10-02 23:33:09 字數 1435 閱讀 1119

題目描述:

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

樣例輸入:ab

樣例輸出:

分析:以emx為例

從題表中可以看出,字串的長度優先順序最高,字典序次之;

因此給定乙個長為len的公升序字串s,可以這麼考察編碼比該字串小的字串個數:

如上圖,

①長度小於len的字串一定比該字串編碼小√

②考察長為len的編碼小於s的字串:

※根據字典序公升序排列,滿足:如果字串是s1、s2的前m位相同,第m+1位:s2[m]

※而對於滿足公升序規則的字串:要使s2s2[m]>s2[m-1]

圖例中emx:

①長度為1、2的公升序字串都在emx之前

②考察第一位:

ⅰ.以a~d開頭的任意長度位3的字串√

ⅱ.以e開頭的字串需考察第二位

考察第二位:

ⅰ.第一位為e,以區間(e,m)之間任意字元為第二位的長為3的字串√

ⅱ.以m為第二位,需考察第三位

考察第三位:

ⅰ.以em為

一、二位,以區間(m,x)之間任意字元為第三位的長為3的字串√

ⅱ.以x為第三位,已經是最後一位,不存在字典序小於emx的字串

每次考察新的位都相當於考察的字串的長度減小1,而且字串的開頭被限制在乙個區間內,因此可以考慮封裝方法

得到以編碼為c的字元開頭的長度位len的公升序字串的個數:

int

getwithinnum

(int c,

int len)

封裝得到所有長為len的公升序字串的個數方法:

int

getsumnum

(int len)

得到字典序比字串s小的字串個數函式**示例:

int

getformernum

(string s)

return sum;

}

主函式:

int

main()

字典序問題

碰到過很多求關於字典序的問題,一直都是用的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的所有...

字典序問題

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