程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Decode Ways -- LeetCode

Decode Ways -- LeetCode

編輯:C++入門知識

 
這道題要求解一個數字串按照字符串編碼方式可解析方式的數量。看到這種求數量的,我們很容易想到動態規劃來存儲前面信息,然後迭代得到最後結果。
我們維護的量res[i]是表示前i個數字有多少種解析的方式,接下來來想想遞歸式,有兩種方式:第一種新加進來的數字不然就是自己比較表示一個字符,那麼解析的方式有res[i-1]種,第二種就是新加進來的數字和前一個數字湊成一個字符,解析的方式有res[i-2]種(因為上一個字符和自己湊成了一個)。當然這裡要判斷前面說的兩種情況能否湊成一個字符,也就是范圍的判斷,如果可以才有對應的解析方式,如果不行,那麼就是0。最終結果就是把這兩種情況對應的解析方式相加。這裡可以把范圍分成幾個區間:
(1)00:res[i]=0(無法解析,沒有可行解析方式);
(2)10, 20:res[i]=res[i-2](只有第二種情況成立);
(3)11-19, 21-26:res[i]=res[i-1]+res[i-2](兩種情況都可行);
(4)01-09, 27-99:res[i]=res[i-1](只有第一種情況可行);
遞推式就是按照上面的規則來得到,接下來我們只要進行一遍掃描,然後依次得到維護量就可以了,算法的時間復雜度是O(n)。空間上可以看出我們每次只需要前兩位的歷史信息,所以只需要維護三個變量然後迭代賦值就可以了,所以空間復雜度是O(1)。代碼如下:

public int numDecodings(String s) {
    if(s==null || s.length()==0 || s.charAt(0)=='0')
    {
        return 0;
    }
    int num1=1;
    int num2=1;
    int num3=1;
    for(int i=1;i='3')
                num3 = num2;
            else
            {
                if(s.charAt(i-1)=='2' && s.charAt(i)>='7' && s.charAt(i)<='9')
                    num3 = num2;
                else
                    num3 = num1+num2;
            }
        }
        num1 = num2;
        num2 = num3;
    }
    return num2;
}
這道題是一維動態規劃的題目,遞推式關系來說是比較容易得到的,主要是要對這些兩位數進行劃分有一些細節,容易出小錯誤。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved