2012-11-26 19 views
1

拼寫的所有可能的話所以我必須找到可以使用分配給一個撥號盤的每個數字字母的電話號碼拼寫所有可能的組合。即:222 6262可以拼寫「A BANANA」。邏輯的發現,可以用一個電話號碼上的撥號盤

鑑於任意數量的任意長度的< 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,6),(6),(7),(6),(6),(6),(6),(6),(5) 2),(5,1,1),(4,3),(4,2,1),(4,1,2),(4,1,1,1)等...

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

回答

0

我能想到的解決方案,但是它取決於如果這些字典在運行時更新,或者固定在發展的時間。如果這些詞典不被時間改變,你不妨做到以下幾點:

  1. 您擁有的字典進行預處理的任務,所以,對於每個字典的每一個字,你創建同等數量(即爲「BANANA」給「226262」)在一些簡單的數據結構。
  2. 存儲這些字典中的「字」字段建立索引,這樣就可以在你的程序再次運行時閱讀7桌(每字長表)的數據庫。
  3. 創建一個採用給定數字「2226262」並返回String ArrayList的方法。對於N = 1至7;獲取前N位數字,並使用您擁有的數字在「N表」中搜索可能的單詞。對於你得到的每一個可能的單詞,再次調用與每個單詞的其餘數字相同的方法(即,如果一個單詞是3個字符,則用最後4位數字調用該方法)。創建一個新的String ArrayList並隨後添加從這些調用中獲得的所有結果,並返回它。
  4. 確保創建終止條件爲這個遞歸,避免「死循環」。我建議檢查方法的開始,如果給定的數字是零長度,如果是,只需返回一個空的String ArrayList。

我希望我做了我的觀點明確

UPDATE

下面是我在說什麼的須藤代碼:

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; 
} 
+0

我得到了1和2(我實際上做的是我使用Arrays.sort和自定義比較器對基於數值的字典進行了排序;然後我通過將字典轉換爲這些數字來進行單獨搜索(現在按升序排列),並使用Arrays.binarySearch進行二進制搜索)。但是,我不確定它是3還是4。我對你在做什麼有一個模糊的想法,但我不確定細節。 – fhyve

+0

我現在給出一個Sudo代碼 –

+0

好吧,我很確定我理解邏輯,特別是定義possibleWords和restOfPossibleWords的行。不幸的是,我對ArrayLists完全不熟悉。這需要很多修改才能使用數組? – fhyve

0

而不是嘗試所有可能的組合,如果你持續關注你爲每個索引獲得的單詞數量...... 例如,它可以節省你的時間。在findWholeWord(dictionary[2], 723); wordCount[2]=7; 因此,爲了清晰起見,我們得到了wordCount[0]=1; wordCount[5]=3;(我無法想象你會得到任何其他1個字母的單詞,但'A'),這意味着你現在必須運行1X3組合而不是7X7。會節省你的子詞匹配一些重要的時間。

相關問題