leetcode——動態(tài)規(guī)劃

91.解碼方法

一條包含字母 A-Z 的消息通過以下方式進行了編碼:
'A' -> 1
'B' -> 2
...
'Z' -> 26
給定一個只包含數(shù)字的非空字符串,請計算解碼方法的總數(shù)。
https://leetcode-cn.com/problems/decode-ways/
思路
思路一:dfs。不合條件的就放棄這條路徑
缺點:會有重復計算。所以效率不是很好。

image.png

class Solution {
    //ArrayList<String>() list = new ArrayList<String>();
    int count =0;
    public int numDecodings(String s) {
        char[] charArray = s.toCharArray();
        dfs(charArray,0);
        return count;
    }
    public void dfs(char[] charArray,int start){
        if(start>=charArray.length)return;
        if(start==charArray.length-1){
            if(isOk(charArray,start,start)){
                count++;
            }
            return;
        }else if(start==charArray.length-2){
            if(isOk(charArray,start,start+1)){
                count++;
            }
            if(isOk(charArray,start,start)){
                dfs(charArray,start+1);
            }
        }else{
            if(isOk(charArray,start,start)){
                dfs(charArray,start+1);
            }
            if(isOk(charArray,start,start+1)){
                dfs(charArray,start+2);
            }
        }
    }
    public boolean isOk(char[] charArray,int start,int end){
        if(end>=charArray.length||start>=charArray.length){
            return false;
        }
        if(start==end){
            return charArray[start]!='0';
        }else{
            switch(charArray[start]){
                case '1':
                    return true;
                case '2':
                    return charArray[end]<='6'&&charArray[end]>='0';
                default:
                    return false;
            }
        }
    }
}

思路2:動態(tài)規(guī)劃
如果沒有1到26的數(shù)字限制,我們很容易把這個問題聯(lián)想到爬樓梯的那個問題。dp[i]=dp[i-1]+dp[i-2]。而現(xiàn)在有一些情況,使得只剩1個數(shù)(末位為0)不成立;有一些情況,使得2位數(shù)不成立(>26或者以0開頭的2位數(shù))。我們需要判斷這些情況

class Solution {
    public int numDecodings(String s) {
        if(s.length()==0||s.charAt(0)=='0')return 0;
        char[] charArray = s.toCharArray();
        int[] dp = new int[s.length()+1];
        dp[0]=1;
        dp[1]=1;
        for(int i=1;i<=s.length()-1;i++){
            int temp = Integer.valueOf(s.substring(i-1,i+1));
            //兩位
            if(temp<=26&&temp>=10){
               dp[i+1]+=dp[i-1]; 
            }
            //1位
            if(temp%10!=0){
                dp[i+1]+=dp[i];
            }
        }
        return dp[s.length()];
    }
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容