題目要求:參考至該作者給定乙個數字,按照如下規則翻譯成字串:0翻譯成「a」,1翻譯成「b」…25翻譯成「z」。乙個數字有多種翻譯可能,例如12258一共有5種,分別是bccfi,bwfi,bczi,mcfi,mzi。實現乙個函式,用來計算乙個數字有多少種不同的翻譯方法。
自上而下,從最大的問題開始,遞迴 :
12258
/ \
b+2258 m+258
/ \ / \
bc+258 bw+58 mc+58 mz+8
/ \ \ \ \
bcc+58 bcz+8 bwf+8 mcf+8 mzi
/ \ \ \
bccf+8 bczi bwfi mcfi
/bccfi
有很多子問題被多次計算,比如258被翻譯成幾種這個子問題就被計算了兩次。
自下而上,動態規劃,從最小的問題開始 :
f(r)表示以r為開始(r最小取0)到最右端所組成的數字能夠翻譯成字串的種數。對於長度為n的數字,f(n)=0,f(n-1)=1,求f(0)。
遞推公式為 f(r-2) = f(r-1)+g(r-2,r-1)*f(r);
其中,如果r-2,r-1能夠翻譯成字元,則g(r-2,r-1)=1,否則為0。
因此,對於12258:
f(5) = 0
f(4) = 1
f(3) = f(4)+0 = 1
f(2) = f(3)+f(4) = 2
f(1) = f(2)+f(3) = 3
f(0) = f(1)+f(2) = 5
上**:
public class translatenumberstostrings
//動態規劃,從右往左算
// f(i) = f(i+1)+f(i+2)*g(i,i+1),其中g(i,i+1)用來判斷兩位是否滿足0~25
private static int gettranslationcount(string str)
else
} return f2;
} public static void main(string args)
}
此外,在劍指offer上面的解析中對g(i,i+1)的解釋是10<=g<=25,我覺得不正確,比如101中的01不止代表一種,我覺得可以分開為0,1和01這兩種情況分別對應ab和b,因為題目中的要求0是有代表字母a的。不知道有沒大佬能給我解釋一下。 把數字翻譯成字串
給定乙個數字,我們按照如下規則把它翻譯為字串 0翻譯成 a 1翻譯成 b 11翻譯成 l 25翻譯成 z 乙個數字可能有多個翻譯。例如12258有5種不同的翻譯,它們分別 bccfi bwfi bczi mcfi 和 mzi 請程式設計實現乙個函式用來計算乙個數字有多少種不同的翻譯方法 1.dfs ...
把數字翻譯成字串
給定乙個數字,我們按照如下的規則將它翻譯成字串 0翻譯成 a 1翻譯成 b 11翻譯成 l 25翻譯成 z 乙個數字可能有多種翻譯,例如,12258有5種翻譯,分別是 bccfi bwfi bczi mcfi 和 mzi 請程式設計實現乙個函式,用來計算乙個數字有多少種不同的翻譯方法。這道題,乍一看...
把數字翻譯成字串
給定乙個數字,我們按照如下規則把它翻譯成字串 0翻譯成 a 1翻譯成 b 11翻譯成 l 25翻譯成 z 乙個數字可能有多個翻譯。例如12258有5種不同的翻譯,分別是 bccfi bwfi bczi mcfi mzi 請程式設計實現乙個函式,用來計算乙個數字有多少種不同的翻譯方法。以12258為例...