天天看點

窮舉搜尋的例子:Google方程式(Java題解)

題目

有一個由字元組成的等式:wwwdot - google = dotcom,每個字元代表一個0~9之間的數字,wwwdot、google和dotcom都是合法的數字,不能以0開頭。請找出一組字元和數字的對應關系,使它們互相替換,并且替換後的數字能夠滿足等式。

思路

據說這是google公司的面試題,我沒有考證過,不過這種字元方程(或字元等式)問題有很多變種,比如2005年的google中國程式設計挑戰賽第二輪淘汰賽有一道名為“secretsum”的500分的競賽題,與本題如出一轍,隻不過字母是3個,而且用的是加法計算。這個問題其實并不難,你可以将其列成豎式減法的形态,然後人工推算出來,不過接下來我們要使用窮舉法來求解這個問題。

從窮舉法的角度看,這是一個典型的排列組合問題,題目中一種出現了9個字母,每個字母都可能是0~9之間的數字,窮舉的方法就是對每個字母用0~9的數字嘗試10次,如果某一次得到的字母和數字的對應關系能夠滿足減法等式,則輸出這一組對應關系。根據題目意思,每個字母代表一個數字,也就是說,如果w代表1,則其他8個字母就不可能是1。很顯然,這是個組合問題,如果不考慮0開頭數字的情況,這樣的組合應該有10×9×8×7×6×5×4×3×2=3628800種組合,在這樣的數量級上使用窮舉法,計算機處理起來應該沒有壓力。

現在考慮給出一種解決這種字元方程問題的通用解法。從資料結構定義上,首先要避免使用固定9個字元的方法,這就需要定義一個可變化的字元元素清單,每個字元元素包含3個屬性,分别是字母本身、字母代表的數字以及是否是數字的最高位。

題解

結果

窮舉搜尋的例子:Google方程式(Java題解)

繼續閱讀