[英]Using a user inputted string of characters find the longest word that can be made
基本上我想創建一個模擬Channel 4上'Countdown'游戲的程序。實際上用戶必須輸入9個字母,程序將搜索字典中可以用這些字母制作的最大單詞。我想一棵樹結構會更好,而不是哈希表。 我已經有一個文件,其中包含字典中的單詞,並將使用文件io。
這是我的文件io類:
public static void main(String[] args){
FileIO reader = new FileIO();
String[] contents = reader.load("dictionary.txt");
}
這是我在Countdown課程中到目前為止所做的
public static void main(String[] args) throws IOException{
Scanner scan = new Scanner(System.in);
letters = scan.NextLine();
}
我從這里完全迷失了。 我知道這只是一個開始,但我不是在尋找答案。 我只是想要一點點幫助,也許是一個指向正確方向的指針。 我只是java的新手,在一本采訪書中發現了這個問題,並認為我應該給它一個。
提前致謝
歡迎來到Java世界:)
我在那里看到的第一件事就是你有兩個主要的方法,你實際上並不需要它。 在大多數情況下,您的程序將只有一個入口點,然后它會完成所有邏輯並處理用戶輸入和所有內容。
您正在考慮一個很好的樹結構,盡管可能有更好的想法存儲它。 試試這個: http : //en.wikipedia.org/wiki/Trie
您的程序要做的是逐行讀取文件中的所有單詞,並在此過程中構建數據結構樹。 完成后,您可以要求用戶輸入,輸入輸入后,您可以搜索樹。
既然你特意要求不提供答案,我不會在這里放置代碼,但隨時可以詢問你是否不清楚某些事情
英語中只有大約800,000個單詞,因此一個有效的解決方案是將這800,000個單詞存儲為800個26個1字節整數數組,計算每個字母在單詞中的使用次數,然后輸入9您為查詢轉換為類似的26整數計數格式的字符,然后如果查詢向量大於或等於單詞向量分量,則可以從查詢字母形成單詞。 您可以通過這種方式輕松處理每秒100個查詢的順序。
我會編寫一個以所有雙字母單詞開頭的程序,然后寫三個字母的單詞,四個字母的單詞等等。
當你做兩個字母的單詞時,你會想要一些方法來挑選第一個字母,然后從剩下的字母中挑選第二個字母。 您可能希望對此部分使用遞歸。 最后,你將根據字典檢查它。 嘗試以一種方式編寫它,這意味着您可以為三個字母的單詞重復使用相同的代碼。
我相信, 正則表達式的強大功能在您的情況下會派上用場:
1)創建一個帶有符號類的正則表達式字符串,如:/ ^ [abcdefghi] * $ /用你的字母代替“abcdefghi”。
2)使用該正則表達式作為過濾器從文本文件中獲取字符串數組。
3)按長度排序。 最長的詞就是你需要的!
有關詳細信息,請查看正則表達式參考 。
UPD:這是一個很好的Java Regex教程 。
第一種方法可以是使用具有詞列表中存在的所有字母的樹。
如果一個節點是單詞的結尾,則將其標記為單詞結尾節點。
在上圖中,最長的單詞是banana 。 但還有其他的話,比如球 , 禁令或平庸 。
因此,節點必須具有:
插入算法非常簡單:在每個步驟中,我們“剪切”單詞的第一個字符,直到單詞不再有字符。
public class TreeNode {
public char c;
private boolean isEndOfWord = false;
private TreeNode[] children = new TreeNode[26];
public TreeNode(char c) {
this.c = c;
}
public void put(String s) {
if (s.isEmpty())
{
this.isEndOfWord = true;
return;
}
char first = s.charAt(0);
int pos = position(first);
if (this.children[pos] == null)
this.children[pos] = new TreeNode(first);
this.children[pos].put(s.substring(1));
}
public String search(char[] letters) {
String word = "";
String w = "";
for (int i = 0; i < letters.length; i++)
{
TreeNode child = children[position(letters[i])];
if (child != null)
w = child.search(letters);
//this is not efficient. It should be optimized.
if (w.contains("%")
&& w.substring(0, w.lastIndexOf("%")).length() > word
.length())
word = w;
}
// if a node its end-of-word we add the special char '%'
return c + (this.isEndOfWord ? "%" : "") + word;
}
//if 'a' returns 0, if 'b' returns 1...etc
public static int position(char c) {
return ((byte) c) - 97;
}
}
例:
public static void main(String[] args) {
//root
TreeNode t = new TreeNode('R');
//for skipping words with "'" in the wordlist
Pattern p = Pattern.compile(".*\\W+.*");
int nw = 0;
try (BufferedReader br = new BufferedReader(new FileReader(
"files/wordsEn.txt")))
{
for (String line; (line = br.readLine()) != null;)
{
if (p.matcher(line).find())
continue;
t.put(line);
nw++;
}
// line is not visible here.
br.close();
System.out.println("number of words : " + nw);
String res = null;
// substring (1) because of the root
res = t.search("vuetsrcanoli".toCharArray()).substring(1);
System.out.println(res.replace("%", ""));
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
輸出:
number of words : 109563
counterrevolutionaries
筆記:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.