1. 程式人生 > >【LeetCode & 劍指offer刷題】動態規劃與貪婪法題3:劍指Offer-46:把數字翻譯成字串

【LeetCode & 劍指offer刷題】動態規劃與貪婪法題3:劍指Offer-46:把數字翻譯成字串

【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...)

劍指Offer-46:把數字翻譯成字串

題目:

給定一個數字,我們按照如下規則把它翻譯為字串:0翻譯成“a”,1翻譯成“b”,……,11翻譯成“1”,……,25翻譯成“z”。一個數字可能有多個翻譯。例如:12258有5種不同的翻譯,分別是“bccfi”、“bwfi”、“bczi”、“mcfi”和“mzi”。請程式設計實現一個函式,用來計算一個數字有多少種不同的翻譯方法。   /* 問題:把數字翻譯成字串
方法:動態規劃   將數字number轉成字串s,方便引用各位 dp[i]表示以s[0~i]的數字翻譯成字串的方法數 則有 dp[i] = dp[i - 1] + g*dp[i - 2] (當s[i-1,i]能組合在一起翻譯成有效字元時,g=1,否則g=0) 上式右邊分別對應兩種分隔方法: s[0~i-1] + s[i](共dp[i-1]種) s[0~i-2] + s[i-1,i](如果g=1,該分隔有效,共dp[i-2]種)
  本題類似:climb stairs */ using namespace std ; #include <iostream> #include <vector> #include <string> int translation ( int number ) {
     if ( number < 0 ) return 0 ;     string s = to_string ( number ); //把數字轉成字串,方便引用各位數字      int n = s . size ();      if ( n == 1 ) return 1 ; //因為通項公式中最少須有兩個初始值          vector < int > dp ( n );//一般dp中序號與實際的序號對應起來,決定分配n空間還是n+1空間     dp [ 0 ] = 1 ; //遞推公式需要兩個初值          int temp = ( s [ 0 ] - '0' )* 10 + s [ 1 ] - '0' //構造組合數      if (temp>=10  && temp<=25 )         dp [ 1 ] = 2 ;      else         dp [ 1 ] = 1 ;        int g = 0 ;      for ( int i = 2 ; i <= n - 1 ; i ++)      {          int temp = ( s [ i - 1 ] - '0' )* 10 + s [ i ] - '0' ;          if ( temp >= 10   && temp <= 25 )              g = 1 ;          else              g = 0 ;         dp [ i ] = dp [ i - 1 ] + g * dp [ i - 2 ]; //假設dp[0]=1,則從dp[2]開始滿足通項公式      }      return dp [ n - 1 ]; }