五筆的編碼和解碼

2021-08-20 15:10:59 字數 2225 閱讀 9721

q:五筆的編碼範圍是a ~ y的25個字母,從1位到4位的編碼,如果我們把五筆的編碼按字典序排序,形成乙個陣列如下: 

a, aa, aaa, aaaa, aaab, aaac, … …, b, ba, baa, baaa, baab, baac … …, yyyw, yyyx, yyyy 

其中a的index為0,aa的index為1,aaa的index為2,以此類推。 

1)編寫乙個函式,輸入是任意乙個編碼,比如baca,輸出這個編碼對應的index; 

2)編寫乙個函式,輸入是任意乙個index,比如12345,輸出這個index對應的編碼。

a:初看一下,編碼並不是按照數字大小進行,而是按照字典序進行排序。首先通過列舉一些例子找找規律。

index[a]=0,index[aa]=1,index[aaa]=2,index[aaaa]=3,前四個字串的規律是strlen(str)-1。

我們再看已知index[a]求index[b]。a,aa,aaaa,aaab,…,ayyy。其中aa->ay(25個數),aaa->ayyy(25*25個數),aaaa->ayyy(25*25*25個數),這樣index[b]=index[a]+25^3+25^2+25+1

再看已知index[aa]求index[ab]。aa,aaa,aaaa,aaab,…,aayy。其中aaa->aay(25個數),aaaa->aayy(25*25個數),這樣index[ab]=index[aa]+25^2+25+1

再看已知index[aaa]求index[aab]。aaa,aaaa,…,aaay。其中aaaa->aaay(25個數)。這樣index[aab]=index[aaa]+25+1

再看已知index[aaaa]求index[aaab]。index[aaab]=index[aaaa]+1。

這樣我們就可以將上述因子放在乙個陣列裡。factor=

我們以bdce為例說明。

對字串從左到右遍歷,首先發現的是b,b距離a的相對index=factor[0],而index[a]=0,所以到達b是factor[0];再看第二個字元d,bd距離ba的長度為factor[1]*(b-a),而ba距離b的長度又為1;所以到達bd是1+factor[0]+factor[1]*(b-a);再看第三個字元c,bdc到bda的長度為factor[2]*(c-a),而bda距離bd的長度又為1,所以到達bdc是1+1+factor[0]+factor[1]*(b-a)+factor[2]*(c-a);最後再看e,bdce到bdca的長度為factor[3]*(e-a),而bdca距離bdc的長度又為1,所以到達dbce是1+1+1+factor[0]+factor[1]*(b-a)+factor[2]*(c-a)。所以編碼就出來了。

1

2

3

4

5

6

7

8

9

10

11

intfactor=;

intencode(char*str)

returnindex;

}

對於第二個問題,解碼就是編碼的逆過程,也是順序求字串的1234個字元就行。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

char* decode(intindex)

str[i]='\0';

returnstr;

}

五筆的編碼和解碼

q 五筆的編碼範圍是a y的25個字母,從1位到4位的編碼,如果我們把五筆的編碼按字典序排序,形成乙個陣列如下 a,aa,aaa,aaaa,aaab,aaac,b,ba,baa,baaa,baab,baac yyyw,yyyx,yyyy 其中a的index為0,aa的index為1,aaa的inde...

五筆的字典序編碼與解碼

假定一種編碼的編碼範圍是a y的25個字母,從1位到4位的編碼,如果我們把該編碼按字典序排序,形成乙個陣列如下 a,aa,aaa,aaaa,aaab,aaac,b,ba,baa,baaa,baab,baac yyyw,yyyx,yyyy 其中a的index為0,aa的index為1,aaa的inde...

演算法練習 五筆編碼

五筆的編碼範圍是a y的25個字母,從1位到4位的編碼,如果我們把五筆的編碼按字典序排序,形成乙個陣列如下 a,aa,aaa,aaaa,aaab,aaac,b,ba,baa,baaa,baab,baac yyyw,yyyx,yyyy,其中a的index為0,aa的index為1,aaa的index為...