美文网首页
leetcode 1858 包含所有前缀的最长单词

leetcode 1858 包含所有前缀的最长单词

作者: 漫行者_ | 来源:发表于2021-08-29 16:35 被阅读0次

来自公司做的编程竞赛题目。
在同事的提醒之下知道用前缀树来做。也就是字典树。。。这个只有一个模糊的印象。
于是网上找了一个博客看了看,定义如下链接。
https://zhuanlan.zhihu.com/p/28891541
主要是注意两个字段:
一个是count,表示当前的字符串个数。
另外一个是pre,表示以该字符串为前缀的个数。

public class TrieNode {
    int count;
    int prefix;
    TrieNode[] nextNode=new TrieNode[26];
    public TrieNode(){
        count=0;
        prefix=0;
    }
}

本题代码如下:

public class Main1 {

    public static void main(String[] args) {
        String[] array = {"a", "ab", "abc", "abd", "dhjd"};
        System.out.println(mm(array));
    }
    public static void insert(TrieNode root, String s) {
        if(root==null && s.length()==1) {
            return;
        }
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if(root.next[c-'a'] == null) {
                root.next[c-'a'] = new TrieNode();
            }
            root = root.next[c-'a'];
            root.prefix++;
        }
        root.count++;
    }

    public static class TrieNode{
        int count;
        int prefix;
        TrieNode[] next = new TrieNode[26];
        public TrieNode(){
            count=0;
            prefix=0;
        }
    }

    public static String mm(String[] array) {
        TrieNode trieNode = new TrieNode();
        //构造前缀树
        for (int i = 0; i < array.length; i++) {
            insert(trieNode, array[i]);
        }
        //加入符合的前缀树。要小心注意a这样的单个字符串也会加入
        List<String> list = new ArrayList<>();
        for (int i = 0; i < array.length; i++) {
            if(isRight(trieNode, array[i])) {
                list.add(array[i]);
            }
        }
        if(list.size() == 0) return "";
        Collections.sort(list);
        //只能从后面开始,找到和最大的那个相同的。
        int len = list.get(list.size()-1).length();
        String res = list.get(list.size()-1);
        for (int i=list.size()-1;i>=0; i--) {
            if(list.get(i).length() == len) {
                res = list.get(i);
            } else {
                return res;
            }
        }
        return res;
    }

    public static boolean isRight(TrieNode trieNode, String str) {
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            trieNode = trieNode.next[c - 'a'];
            if(trieNode.count < 1) {
                return false;
            }
        }
        return true;
    }
}

相关文章

网友评论

      本文标题:leetcode 1858 包含所有前缀的最长单词

      本文链接:https://www.haomeiwen.com/subject/rwaiiltx.html