zoukankan      html  css  js  c++  java
  • 算法

    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,我们就返回这个前缀,如果当前字母对应的结点在前缀树中不存在,我们就返回原单词,这样就能完美的解决问题了。所以啊,以后遇到了有关前缀或者类似的问题,一定不要忘了前缀树这个神器哟~

  • 相关阅读:
    B
    给定二叉树先序、中序遍历序列,求后序遍历
    24点游戏dfs求解
    设计模式之单例模式
    生产者—消费者模式示例
    LeetCode(3):Longest Substring Without Repeating Characters
    LeetCode(5):Longest Palindromic Substring
    LeetCode(60):Permutation Sequence
    LeetCode(50):Pow(x,n)
    LeetCode(69):Sqrt(x)
  • 原文地址:https://www.cnblogs.com/qlky/p/7705516.html
Copyright © 2011-2022 走看看