題目和思路來自程式設計之美
題目:**的號碼盤一般可以用於輸入字母,而且乙個數字可以對應多個或者0個字母。如用2可以輸入a、b、c,用3可以輸入d、e、f等。
給出乙個號碼,它可以對應許多個字母組合。如號碼5869872,它對應的字母組合可以是jtmwtpta、jtmwtb······
問題(1)給出乙個**號碼,設計程式,從該**號碼對應的這些字母組合中,找到乙個有意義的單詞來表述乙個**號碼。
舉例:單詞"computer"來描述號碼26678837。
問題(2)對於乙個號碼,是否可以用乙個單詞代表?(否)怎樣才是最快的方法?
綜合這兩個問題,其實就是找出最快的方法,使得找到乙個有意義的單詞與數字對應?
思路:方法(1)對字母集合進行深搜 + 字典匹配
<1>直接對每乙個數字對應的字母集合進行深搜,類似元素的組合求出所有字母集合
<2>對每一種組合都與字典匹配,有意義則輸出
**:這裡指給出深搜求字母組合的遞迴**
#include #include using namespace std;
void perm(char strset[10][10],int narrtelenum,int nlen,int ncur,int npos,char strword)
perm(strset,narrtelenum,nlen,0,0,strword);
system("pause");
return 1;
}
迭代**:
書中給出了乙個不確定迴圈個數的**,挺有意思。可以一看。
#includeusing namespace std;
const int maxlength = 9;
char c[10][10] = ;
int total[10] = ;
int main()
; //本例輸入數字3,4,5
int answer[maxlength] = ;
int len = 3;
while(true)
else//第k位的數已經全部放完,此時需要設定第k - 1位。
}if(k < 0)//所有元素均處理完了。
break;
} return 0;
}
方法(2)離線
求出每乙個數字組合對應的字母組合
字典匹配
這裡**不再給出。
方法(3)字典單詞轉化為數字 + 與給出數字進行匹配
思路:把字典中的單詞轉換為數字,之後把轉換後的數字與給出的數字進行匹配。
這裡**不再給出。
電話號碼對應英語單詞
號碼盤一般可以用於輸入字母,如2可以輸入a b c,等等。要求設計號碼所對應的所有組合。如5969872可以對應 jtmwtpa jtmwtpb等。這就相當於排列數,如5對應j k l,以j k l各自引出9對應的w x y z這些數字的組合就構成一棵樹。我們可以構建乙個二維陣列charc 10 1...
電話號碼對應英語單詞
題目描述 實現 public class recursivesearch 0 0表示空字元 1 2 3 4 5 6 7 8 9 static int total 分別表示0 9所代表的字元的個數 public static void main string args 假設 號碼為234,number...
LeetCode每日一題 電話號碼 回溯演算法
輸入法九鍵,每個按鍵都代表著不用的字母,我們需要找到不同字影射,來進行不同序列的組成。如下是leetcode第十七題。給定乙個僅包含數字 2 9 的字串,返回所有它能表示的字母組合。給出數字到字母的對映如下 與 按鍵相同 注意 1 不對應任何字母。示例 輸入 23 輸出 ad ae af bd be...