簡體   English   中英

使用用戶輸入的字符串找到可以制作的最長單詞

[英]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 但還有其他的話,比如禁令平庸

因此,節點必須具有:

  1. 一個人物
  2. 如果它是一個單詞的結尾
  3. 一份兒童名單。 (最多26)

插入算法非常簡單:在每個步驟中,我們“剪切”單詞的第一個字符,直到單詞不再有字符。

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.

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