LeetCode-091-解碼方法

雄獅虎豹發表於2021-10-21

解碼方法

題目描述:一條包含字母 A-Z 的訊息通過以下對映進行了 編碼 :

'A' -> 1
'B' -> 2
...
'Z' -> 26
要 解碼 已編碼的訊息,所有數字必須基於上述對映的方法,反向對映回字母(可能有多種方法)。例如,"11106" 可以對映為:

"AAJF" ,將訊息分組為 (1 1 10 6)
"KJF" ,將訊息分組為 (11 10 6)
注意,訊息不能分組為 (1 11 06) ,因為 "06" 不能對映為 "F" ,這是由於 "6" 和 "06" 在對映中並不等價。

給你一個只含數字的 非空 字串 s ,請計算並返回 解碼 方法的 總數 。

題目資料保證答案肯定是一個 32 位 的整數。

示例說明請見LeetCode官網。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

解法一:遞迴 窮舉
  • 首先,當snull或者是空字串或者s是以0開頭的字串,不可能對映成功,直接返回0
  • 如果s的長度為1,直接返回1。
  • 然後是遞迴處理當s的長度大於1的情況,遞迴方法處理邏輯如下(方法的入參leftright分別為當前要匹配的字元的開始和結束位置0 < (right - left) < 3):

    • 如果left位置的數字為0即要匹配的字元是以0開頭,則無法對映,直接返回;
    • 如果leftright所匹配的字元數大於26,無法對映,返回;
    • 如果rights的最後一位,則result加1,返回;
    • 如果rights的倒數第二位,且最後一位不是0,則result加1,返回;
    • 後面則根據right後的位數繼續遞迴處理right ~ right + 1right ~ right + 2的情況。
  • 最後返回result即為解碼方法的總數。
public class LeetCode_091 {

    private static int result = 0;

    /**
     * 遞迴 窮舉:效能較差,提交會超時
     *
     * @param s
     * @return
     */
    public static int numDecodings(String s) {
        // 這些情況無法對映,直接返回0
        if (s == null || s == "" || s.equals("0") || s.startsWith("0")) {
            return 0;
        }

        if (s.length() == 1) {
            return 1;
        }

        numDecodings(s, 0, 1);
        numDecodings(s, 0, 2);
        return result;
    }



    public static void numDecodings(String s, int left, int right) {
        if (s.charAt(left) == '0') {
            return;
        }
        if (Integer.valueOf(s.substring(left, right)) > 26) {
            return;
        }
        if (s.length() - right == 0) {
            result++;
            return;
        }
        if (s.length() - right == 1 && s.charAt(s.length() - 1) != '0') {
            result++;
            return;
        }
        numDecodings(s, right, right + 1);
        if (s.length() - right > 1) {
            numDecodings(s, right, right + 2);
        }
    }

    public static void main(String[] args) {
        System.out.println(numDecodings("226"));
    }
}
【每日寄語】 與天奮鬥,其樂無窮!與地奮鬥,其樂無窮!與人奮鬥,其樂無窮!

相關文章