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