程式設計之美之電話號碼對應英語單詞

fangjian1204發表於2014-08-15

題目一:根據電話上字母和數字的對應關係,用一個有意義的單詞來表述一個電話號碼,如用computer表示26678837

題目二:反過來,給定一個電話號碼,是否可以用一個單詞來表示呢?怎樣表示最快呢?顯然不是所有的電話號碼都可以對應到單詞上去

首先來看看leetcode上一個類似的題目:

Letter Combinations of a Phone Number

 

Given a digit string, return all possible letter combinations that the number could represent.

A mapping of digit to letters (just like on the telephone buttons) is given below.

Input:Digit string "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

Note:
Although the above answer is in lexicographical order, your answer could be in any order you want.

思路:用遞迴實現比較簡單,首先建立一個hash表,然後對每一個數字,深度搜尋可能的取值,當每個數字都取一個值之後,就得到了一個結果,具體如下:

class Solution {
public:
    void letterCombinations(string& digits,int index,string* map,string words,vector<string>& res)
    {
    	if(index == digits.size())//得到一個結果
    	{
    		res.push_back(words);
    		return;
    	}
    	int i;
    	for(i = 0; i < map[digits[index] - '0'].size();++i)//取第index個數字上的每一個字元,進行深度遞迴
    	{
    		letterCombinations(digits,index + 1,map,words+map[digits[index] - '0'][i],res);
    	}
    }
    vector<string> letterCombinations(string digits) {
    	string map[10] = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};//數字和字母的對應關係
    	vector<string> res;
    	letterCombinations(digits,0,map,"",res);
    	return res;
    }
};
根據這個題目,上面的兩個問題就比較簡單了,正如程式設計之美上說的:對於問題二,我們找出該電話所有可能組合,然後去匹配字典,判斷是否有答案。當然,如果查詢的次數比較多,可直接把字典裡的所有單詞都按照這種轉化關係對映成數字,並儲存到檔案中,然後對這個電話號碼按照查表的方式來得到結果。


相關文章