簡體   English   中英

查找撥號盤上可以用電話號碼拼寫的所有可能單詞的邏輯

[英]Logic for finding all possible words that can be spelled with a phone number on a dial pad

因此,我必須找到使用撥號盤上為每個號碼分配的字母可以用電話號碼拼寫的所有可能組合。 即:222 6262可以拼寫為“香蕉”。

給定任何長度小於8的數字,我可以找到一個與整數匹配的所有單詞。 即, findWholeWord(dictionary[2], 723)將給我一個字符串數組{"RAD", "RAE", "RAF", "SAD", "SBF", "PAE", "PAD"} (字典我被告知有點愚蠢...)。 我的字典分為7個部分,每個部分包含相同長度的單詞。

我不確定如何獲取7位數字並給出所有單詞組合,例如一個單詞長6,一個單詞長度為1(6,1),5和2,5和1以及1、4和3、4以及2和1。我想扔掉所有不能覆蓋整個單詞的東西(任何帶有0或1、3個字母和2個字母的單詞與后2個字母都不匹配的單詞)。 我不知道該怎么做。 我很確定這種邏輯有一個名字,因為我畫了一棵樹並且它有一個不錯的模式,但是我不知道該模式被稱為什么或確切地被稱為什么。

一種方法是找到所有子詞,然后嘗試以任何可行的方式將它們組合在一起,另一種方法是嘗試所有可能的詞長組合:(7),(6,1),(5,2),( 5,1,1),(4,3),(4,2,1),(4,1,2),(4,1,1,1)等...

不知道怎么做,不知道哪個會更容易,不知道哪個會最有效。

我可以想到一個解決方案,但這取決於這些字典是在運行時更新還是在開發時固定。 如果這些詞典不隨時間變化,則可以執行以下操作:

  1. 對您擁有的字典執行預處理任務,以便為每個詞典中的每個單詞創建一個簡單的數據結構中的等效數字(即對於“ BANANA”給出“ 226262”)。
  2. 將這些詞典存儲在由“ Word”字段索引的7個表(每個單詞長度一個表)的數據庫中,以便您可以在程序運行時再次讀取它們。
  3. 創建一個采用給定數字“ 2226262”並返回String ArrayList的Method。 對於N = 1至7; 取第一個N位數字,並使用您擁有的數字在“ N表”中搜索可能的單詞。 對於您得到的每個可能的單詞,請使用每個單詞的其余數字再次調用相同的方法(即,如果單詞為3個字符,則使用最后4個數字調用該方法)。 創建一個新的String ArrayList,然后添加從這些調用中獲得的所有結果,然后將其返回。
  4. 確保為此遞歸設置終止條件,以避免“無限遞歸”。 我建議在方法的開頭檢查給定的數字是否為零長度,如果是,則僅返回一個空的String ArrayList。

我希望我說的清楚

更新

這是我在說的sudo代碼:

ArrayList<String> getWordsOf(String Number){
    if(Number.isEmpty()){
        return new ArrayList<String>();
    }
    ArrayList<String> allPossibleWords = new ArrayList<String>();
    for(int i=1; i<=Number.length(); i++){
        ArrayList<String> possibleWords = getFromDataBase(Number.substring(0,i));
        ArrayList<String> restOfPossibleWords = getWordsOf(Number.substring(i,Number.length()-i));
        for(String possibleWord:possibleWords){
            for(String restOfPossibleWord:restOfPossibleWords){
                allPossibleWords.add(possibleWord+" "+restOfPossibleWord);
            }
        }
    }
    return allPossibleWords;
}

如果您不對每個索引獲得的單詞數進行計數,則可以嘗試節省所有時間,而不是嘗試所有可能的組合,例如。 findWholeWord(dictionary[2], 723); wordCount[2]=7; findWholeWord(dictionary[2], 723); wordCount[2]=7; 因此,為了清楚起見,我們得到wordCount[0]=1; wordCount[5]=3; wordCount[0]=1; wordCount[5]=3; (我無法想象您會收到除“ A”以外的任何其他1個字母的單詞),這意味着您現在只需要運行1X3組合而不是7X7。 將節省與子詞匹配的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM