LintCode習題系列之解碼方法

2021-08-11 14:31:37 字數 2123 閱讀 2708

這是筆者在lintcode社群刷題的經歷,希望思考的過程對讀者有所幫助

題目描述:

有乙個訊息包含a-z通過以下規則編碼

『a』 -> 1 直到 『z』 -> 26

現在給你乙個加密過後的訊息,問有幾種解碼的方式

例項:

12 : 1|2 代表ab,12代表l,共兩種情況

思路

首先排除特殊情況:

①若輸入的string為「」,則結果為0

②若輸入的string位數為1,則結果為1

然後是思路,也就是動態規劃的自底向上實現:

①我們假設有數字串1232435,已知當前結果為x,則在後續插入5,變成12324355,結果會如何?

我們有且只有兩種分法:1232435|5 123243|55

前者結果也為x,而後者結果為0,因為55顯然無法對應乙個英文本母(在這裡我們不關心1232435的x中方法具體是什麼,因為滿足無後效性,也就是可以動態規劃解決),此時結果為x+0 = x.

②同樣的,如果是12321,後續插入1,則分為兩種情況:

12321|1 1232|11

也就是說,我們可以得出前四位的最佳解 +前五位的最佳解 =第六位最佳解!(僅當56位的數字合起來屬於1-26之間)

實現中的漏洞:

實現中發現了乙個格格不入的數字0

當0出現時,只能搭配成10或者20,且(敲黑板)重要的是,10,20將整個數字隔開了!!

舉個栗子12334510324201314,因為10和20的存在,必須分為

123345|10|324|20|1314, 也就是說,此時此刻,結果應該是123345的值*324的值*1314的值,獲取值的方法參考之前的動態規劃即可。

因此**思路如下:

①判斷s是否為「」,或者長度是否為1

②如果存在第一位是0,或者0之前不是1,2,那麼無法分割,結果為0

③將整個數字按照10和20隔開,分別計算每一段的可能的分割數

④s的第一位必須為1或者2,其他數字比如說第一位為3,則3肯定和後續數字分開,因為3作十位必然超過30,無法轉為字母,可以稍作處理。

⑤因為推當前位必須知道前兩位,所以推下標為2的數字必須依靠0和1,0和1需要自行初始化。

**:綜上,**如下

public static int numdecodings(string s) 

char cs = s.tochararray();

if (cs[0] == '0')

for (int j = 1; j < cs.length; j++)

}int i = 0;

for (; i < s.length(); i++)

}s = s.substring(i).replace("10", " ").replace("20", " ");

string ss = s.split(" ");

int result = 1;

for (string stemp : ss)

return result;

}private static int calculate(string s)

if (s.length() == 2) else

}int num = new int[s.length()];

num[0] = 1;

if (integer.valueof(s.substring(0, 2)) <= 26) else

for (int j = 2; j < num.length; j++) else

}return num[num.length - 1];

}

經測試,**成功通過檢驗

謝謝您的閱讀,希望對您有所幫助

LintCode 解碼方法

512.解碼方法 有乙個訊息包含a z通過以下規則編碼 a 1 b 2 z 26現在給你乙個加密過後的訊息,問有幾種解碼的方式 樣例給你的訊息為12,有兩種方式解碼 ab 12 或者 l 12 所以返回2 標籤 動態規劃 字串處理 很陰的一道題,前後都是坑。第一眼看上去就是第i個字元位置的解碼方式數...

Python系列之編譯碼JSON資料

json 模組提供了一種很簡單的方式來編碼和解碼json資料。其中兩個主要的函式是 json.dumps 和 json.loads syntax json.dump d,skipkeys false,ensure ascii true,check circular true,allow nan tr...

leetcode系列 演算法 中等 解碼方法

動態規劃 最後一位如果不是0,只有1中解碼方式 從倒數第二位開始,假設索引值為index,共有下述3種情況 s index 0,跳過當前位繼續遍歷 0 s index 26,當前為有效位,則index位的解碼方式累加 index 1的解碼方式 0 s index index 2 26,當前位 下一位...