1. 簡述
**的號碼盤一般可以用於輸入字母。如用2可以輸入a、b、c,用3可以輸入d、e、f等。
對於號碼5869872,可以依次輸出其代表的所有字母組合。如:jtmwtpa、jtmwtb······
1) 設計程式,盡可能從這些字母組合中,找到乙個有意義的單詞來表述乙個**號碼。如單詞"computer"來描述號碼26678837。
2) 對於乙個號碼,是否可以用乙個單詞代表?怎樣才是最快的方法?
2. 思路
由於兩個任務都需要判斷乙個字母組合是否是乙個單詞,所以必須預先存乙份單詞列表。
方法一:直接對號碼進行深度優先搜尋,空間基本上沒怎麼用,就是時間太大了。假設,單詞列表長度為n,號碼k位,乙個按鍵3個字元(實際上,不是每個數字對應的字元個數都一樣),這就是3^k種字串行。每找到乙個序列,還要去單詞列表裡面查詢,o(n),這還沒算每次字串行和單詞匹配的具體時間,總之時間複雜度很高。
方法二:空間換時間,這就有兩個具體思路。
乙個是從號碼這邊走,把每個號碼對映為乙個數字,然後把每個數字對應的字串找到,再根據單詞列表,找到單詞,實際上是把方法1中的任務離線做好了。這樣有乙個問題一般手機都有11位(每位假設都可以是0-9),這就是10^11種,100g個數字,每種數字再用方法一的方法進行操作,複雜度可想而知。
另乙個方法是從單詞這邊走,實際上,英語單詞個數是有限的,常用單詞也就幾千,考gre也就幾萬吧,假設10萬個單詞,我們找到每個單詞對應的號碼,也是10萬。對這10萬個單詞可以用lucene建個索引,或者搞個字典樹,對於索引,每個號碼掛上對應單詞在單詞列表中的下標,對於字典樹,每個號碼節點掛上對應單詞在單詞列表中的下標。
這樣來個乙個號碼,找到這個號碼是否存在於索引和字典樹的複雜度基本上就是常數級別,如果找到了,就能找到對應單詞在單詞列表中下標,進一步找到單詞,如果找不到號碼,就說明沒有對應單詞。
3.
#include#define tellength 3
using namespace std;
//將各個數字多能代表的字元儲存在乙個二維陣列中
char c[10][10]=
;//將各個數字所能代表的字元總數記錄於另乙個陣列中
int total[10]=;
//用乙個陣列儲存**號碼
int number[tellength];//tellength為**號碼的位數
//將陣列目前能代表的字元在其所能代表的字符集中的位置用乙個陣列儲存起來
int answer[tellength];//初始化answer[i]=0
/*舉個例子,若number[0]=4,即**號碼的第一位為4,若answer[0]=2,即4目前所代表的字元為
c[number[0]][answer[0]]=c[4][2]='i'*/
//method1直接迴圈法
//假設**號碼只有3位,那麼很快會寫出3個for迴圈來
void directcycle()
else//第k位的數已經全部放完,此時需要設定第k - 1位。
} if(k < 0)//所有元素均處理完了。
break;
} }//method3
/*index說明對**號碼的第幾位進行迴圈
*/void recursivesearch(int index)
int main()
程式設計之美 3 2 電話號碼對應英語單詞
的號碼盤一般可以用於輸入字母。如用2可以輸入a b c,用3可以輸入d e f等。對於號碼5869872,可以依次輸出其代表的所有字母組合。如 jtmwtpa jtmwtb 1 設計程式,盡可能從這些字母組合中,找到乙個有意義的單詞來表述乙個 號碼。如單詞 computer 來描述號碼2667883...
《程式設計之美》 電話號碼對應英語單詞
問題 的號碼盤一般可以用於輸入字母,如用2可以輸入a,b,c,用3可以輸入d,e,f等。對於號碼5869872,可以依次輸出其代表的所有字母組合。如 jtmwtpa,jtmwtpb 1 您能否可以根據這樣的對應關係設計乙個程式,盡可能快地從這些字母組合中找到乙個有意義的單詞來描述乙個 號碼呢?如 可...
程式設計之美 電話號碼對應英語單詞
問題描述 的號碼盤上乙個數字對應著幾個字母,一串數字對應著幾種字母的組合。現在給定一組數字,列出對應的字母的組合。思路 例如 4對應鍵盤上 ghi,2對應鍵盤上 abc 數字 42 的組合對應的字串,用樹的表現形式 424 g h i 2 a b a b a b 結果 ga,gb,ha,hb,ia,...