leetcode——?jiǎng)討B(tài)規(guī)劃

91.解碼方法

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

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:動(dòng)態(tài)規(guī)劃
如果沒(méi)有1到26的數(shù)字限制,我們很容易把這個(gè)問(wèn)題聯(lián)想到爬樓梯的那個(gè)問(wèn)題。dp[i]=dp[i-1]+dp[i-2]。而現(xiàn)在有一些情況,使得只剩1個(gè)數(shù)(末位為0)不成立;有一些情況,使得2位數(shù)不成立(>26或者以0開(kāi)頭的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()];
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容