算法

Replace Words

一开始我的思路:

HashSet + StringBuilder,每个词遍历在set中查找。

class Solution {
    public String replaceWords(List<String> dict, String sentence) {
        Set<String> set = new HashSet<>();
        
        for(String str : dict) set.add(str);
        
        String [] s = sentence.split(" ");
        
        StringBuilder res = new StringBuilder();
        
        for(String str : s)
        {
            boolean flag = false;
            for(int i=1;i<str.length();i++)
            {
                String tmp = str.substring(0,i);
                if(set.contains(tmp))
                {
                    res.append(tmp+" ");
                    flag = true;
                    break;
                }
            }
            if(!flag) res.append(str + " ");
        }
        
        return res.toString().substring(0,res.length()-1);
    }
}

但效率并不高,这道题最好的解法其实是用前缀树(Trie / Prefix Tree)来做,关于前缀树使用之前有一道很好的入门题Implement Trie (Prefix Tree)。了解了前缀树的原理机制,那么我们就可以发现这道题其实很适合前缀树的特点。我们要做的就是把所有的前缀都放到前缀树里面,而且在前缀的最后一个结点的地方将标示isWord设为true,表示从根节点到当前结点是一个前缀,然后我们在遍历单词中的每一个字母,我们都在前缀树查找,如果当前字母对应的结点的表示isWord是true,我们就返回这个前缀,如果当前字母对应的结点在前缀树中不存在,我们就返回原单词,这样就能完美的解决问题了。所以啊,以后遇到了有关前缀或者类似的问题,一定不要忘了前缀树这个神器哟~

原文地址:https://www.cnblogs.com/qlky/p/7705516.html