字典序問題:在資料加密和資料壓縮中需要對特殊的字串進行編碼。給定的字母表由26
2626
個小寫字母組成。該字母表產生的公升序字串是指字串中字母從左到右出現的次序與字母在字母表**現的次序相同,且每個字元最多出現1
11次。對於任意長度不超過6
66的公升序字元中,迅速計算出它在上述字典中的編碼。
顧名思義,字典序,也就是要求給定字串在公升序字典中字典序的編號。
字典序編號如表:12
34…26
2728…a
bcd…
zabac…
計算字典序編號,可以轉化為計算該字串前面有多少個字串。
計算長度小於k
kk的公升序字串的總個數。
計算長度等於k
kk的字典序小於(即編號在其前面)給定串的總個數。
dfsc++(i,k
)dfs(i,k)
dfs(i,
k)遞迴求以i
ii開頭長度為k
kk的公升序字串的總個數。
f un
(k
)fun(k)
fun(k)
計算長度為k
kk的公升序字串總個數。
c++c+
+:
#include
using
namespace std;
typedef
long
long ll;
ll dfs
(int i,
int k)
for(
int j = i +
1; j <=
26; j++
)return sum;
}ll fun
(int k)
return sum;
}signed
solve()
ll temp =0;
for(
int i =
0; i < len; i++
) temp = num;
} cout << ans << endl;}}
signed
main()
pyt
hon:
python:
python
:
def
dfs(i, k)
:sum=0
if k ==1:
return
1for j in
range
(i +1,
27):sum
+= dfs(j, k -1)
return
sumdef
fun(k)
:sum=0
for i in
range(1
,27):
sum+= dfs(i, k)
return
sumdef
main()
: s =
input()
iffalse
== s.isalpha():
print
('請輸入公升序字母字串'
)else
: ans, l, temp =1,
len(s),0
for i in
range(1
, l)
: ans += fun(i)
for i in
range
(l):
num =
ord(s[i])-
ord(
'a')+1
len2 = l - i
for j in
range
(temp +
1, num)
: ans += dfs(j, len2)
temp = num
print
(ans)
if __name__ ==
"__main__"
: 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的公升序字串按照字典...