有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在trie图中插入一个新字符串

我正在尝试实现Patricia Trie数据结构的插入方法,我正在尝试处理这个案例:

  • 第一个字符串:abaxyzalexsky
  • 第二个字符串:abaxyzalex
  • 第三个字符串:abaxyz
  • 第四个字符串:aba

在插入第四个字符串后,我想将trie标记为下面的aba-xyz-alexsky,但我不知道如何才能让它工作

在上面的例子中,我如何标记trie中的单词

public void insert(String s) {
    if (nodeRoot == null) {
        nodeRoot = new TrieNode(s);
        nodeRoot.isWord = true;
    } else {
        insert(nodeRoot, s);
    }

}
private void insert(TrieNode node, String s) {

    int len1 = node.edge.length();
    int len2 = s.length();
    int len = Math.min(len1, len2);
    ArrayList<TrieNode> nextNode = node.getNext();

    for (int index = 0; index < len; index++) {
        if (s.charAt(index) != node.edge.charAt(index)) {

            // In case the both words have common substrings and after the
            // common substrings the words are split. For example abad, abac

} else if (index == (s.length() - 1)
                || index == (node.edge.length() - 1)) {
            // In case the node just needs one path since one word is
            // substring of the other.
            // For example (aba and abac)

            if (len1 > len2) {
                // node edge string is longer than the inserted one. For example (abac
                // and aba).

                String samesubString = node.edge.substring(0, index + 1);
                String different = node.edge.substring(index + 1);
                node.edge = samesubString;


                if (node.getNext() != null && !node.getNext().isEmpty()) {
                    for (TrieNode subword : node.getNext()) {
                       //I am here when I insert the third string. The code below retrives wrong data structure.
                        TrieNode node1 = new TrieNode(different);
                        node1.isWord = true;
                        node1.next.add(subword);
                        node.next.add(node1);                           

                    }
                } else {
                    TrieNode leaf = new TrieNode(different);
                    leaf.isWord = true;
                    node.next.add(leaf);

                    for (TrieNode subword : node.getNext()) {
                        System.out.println(node.getEdge() + "---"
                                + subword.getEdge());
                    }

                }

            } else {
                // new inserted string value is longer. For example (aba
                // and abac).

            }

        } else {

            System.out.println("The strings are the same - " + index);

        }

    }

}

NodeTrie类

package patriciaTrie;

import java.util.ArrayList;

public class TrieNode {


    ArrayList<TrieNode> next = new ArrayList<TrieNode>();
    String edge;
    boolean isWord;

    TrieNode(String edge){
        this.edge = edge;

    }

    public ArrayList<TrieNode> getNext() {
        return next;
    }

    public void setNext(ArrayList<TrieNode> next) {
        this.next = next;
    }

    public String getEdge() {
        return edge;
    }

    public void setEdge(String edge) {
        this.edge = edge;
    }
}

共 (0) 个答案