題目描述:‘1-26’對應着‘A-Z’,輸入一串數字,輸出最多有多少種解碼方式。
參考C++代碼:https://blog.csdn.net/LaoJiu_/article/details/50887487,編寫的python版本。
while True:
N_str = input()
if N_str=='quit':
break
else:
n = len(N_str)
max_len = [0]*(n+1)
max_len[0] = 1
max_len[1] = 1
#max_len[i+1]即爲到包括i這一位的字符串最大的編碼方式
if n>1:
for i in range(n):
if N_str[i]=='0':
max_len[i+1] = max_len[i-1]
elif int(N_str[i])<=6:
if N_str[i-1]=='1' or N_str[i-1]=='2':
max_len[i+1]=max_len[i]
max_len[i+1]+=max_len[i-1]
else:
max_len[i+1]=max_len[i]
else:
if N_str[i-1]=='1':
max_len[i+1]=max_len[i]
max_len[i+1]+=max_len[i-1]
else:
max_len[i+1]=max_len[i]
ans = max_len[n]
print(ans)
雖然借鑑的的是原博主的代碼,還是對某些地方有些疑問,所以按自己的想法進行了修改,比較關鍵的是
if N_str[i]=='0':
max_len[i+1] = max_len[i-1] #原代碼是i-2
當第i位字符爲'0'時,它必須與前面的數字綁定,不論是大於2還是小於等於2,只有一種編碼方式,那麼此時的編碼方式應該與前i-2位字符(包括第i-2位)的編碼方式數量相同,根據對應關係應該是max_len[i+1]= max_len[i-1]。
又通過代碼驗證,當輸入數字爲11060時,採用max_len[i+1]= max_len[i-1]得到結果爲1;而採用max_len[i+1]= max_len[i-2]得到結果爲2。按照本人對題意的理解,此時的編碼方式數量應該是1。故做了上述修改。
有不同的理解或者建議,歡迎評論,一起探討下。