算法:前缀树匹配;Trie

核心算法

class TrieNode {            // 最标准写法

    private TrieNode[] children; 
    private boolean isEnd;// 字符的结尾

    public TrieNode() {
        isEnd = false;
        children = new TrieNode[26]; // 巧妙的用数组的下标作为26个字母;数组的值则为子节点,每一个子节点都可以扩展 26个;
    }

    /**
     * 构建一个基于 字符下标的的数组,并构成树形结构
     *
     * @param word
     */
    public void insert(String word) {
        // 顶层数据;
        TrieNode node = this;
        // 循环字符串
        for (int i = 0; i < word.length(); i++) {
            int c = word.charAt(i) - 'a'; // 将字符串 的字符 转换成数字;,比较的时候也是这样;

            if (node.children[c] == null) {
                node.children[c] = new TrieNode(); // 如果当前node 的 children 没有此字符, 那么就给当前新增一个对象
            }
            node = node.children[c]; // 将字符对应的 node节点,重置为当前节点, 等待下一轮数据;
        }
        node.isEnd = true;   // 字符串的最后一个字符坐标 状态设置为  true
    }


    public boolean search(String word) {
        TrieNode node = searchPrefix(word);
        return node != null && node.isEnd;
    }

    public boolean startsWith(String prefix) {
        return searchPrefix(prefix) != null;
    }


    public TrieNode searchPrefix(String prefix) {

        // 最外一层对象;
        TrieNode node = this;

        for (int i = 0; i < prefix.length(); i++) {
            int c = prefix.charAt(i) - 'a'; // 将字符串用转换成数字;
            // 如果没有找到,那么就结束了
            if (node.children[c] == null) {
                return null;
            }
            // 如果找到了,就进入下一层去找;
            node = node.children[c];
        }
        return node;
    }

验证

 public static void main(String[] args) {
        TrieNode trieNode = new TrieNode();
        trieNode.insert("hello");
        trieNode.insert("node");

        boolean a =trieNode.startsWith("noe");
        System.out.println(a);

//        System.out.println(trieNode);
    }

你可能感兴趣的:(算法,c#,开发语言)