力扣——单词替换

在英语中,我们有一个叫做 词根(root)的概念,它可以跟着其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如,词根an,跟随着单词 other(其他),可以形成新的单词 another(另一个)。

现在,给定一个由许多词根组成的词典和一个句子。你需要将句子中的所有继承词词根替换掉。如果继承词有许多可以形成它的词根,则用最短的词根替换它。

你需要输出替换之后的句子。

示例 1:

输入: dict(词典) = ["cat", "bat", "rat"]
sentence(句子) = "the cattle was rattled by the battery"
输出: "the cat was rat by the bat"

注:

  1. 输入只包含小写字母。
  2. 1 <= 字典单词数 <=1000
  3. 1 <=  句中词语数 <= 1000
  4. 1 <= 词根长度 <= 100
  5. 1 <= 句中词语长度 <= 1000
import java.util.List;

class Solution {

    private class Trie{
        private boolean leaf;
        private Trie[] childs;

        public Trie() {
            this.childs = new Trie[26];
        }

        public boolean isLeaf() {
            return leaf;
        }

        public void setLeaf(boolean leaf) {
            this.leaf = leaf;
        }

        public Trie getChild(char c) {
            return childs[c- 'a'];
        }

        public Trie addChild(char c){
            Trie a = new Trie();
            childs[c - 'a'] = a;
            return a;
        }

        public Boolean hasChild(char c){
            if(childs[c-'a'] != null){
                return true;
            }
            return false;
        }

        public void addWord(String word){
            Trie now = this;
            if(word == null || word.isEmpty()){
                return;
            }
            for(char c : word.toCharArray()){
                if(now.hasChild(c)){
                    now = now.getChild(c);
                }else{
                    now = now.addChild(c);
                }
            }
            now.setLeaf(true);
        }

        public String getShortTestRoot(String word){
            String res = "";
            if(word == null || word.isEmpty()){
                return res;
            }
            Trie now = this;
            for(char c : word.toCharArray()){
                if(now.hasChild(c)){
                    now = now.getChild(c);
                    res += c;
                    if(now.isLeaf()){
                        return res;
                    }
                }else{
                    break;
                }
            }
            return "";
        }
    }

    public String replaceWords(List<String> dict, String sentence) {
        Trie root = new Trie();
        for(String w : dict){
            root.addWord(w);
        }
        String[] dep = sentence.split(" ");
        for(int i = 0; i< dep.length; i++){
            String change = root.getShortTestRoot(dep[i]);
            if(!change.isEmpty()){
                dep[i] = change;
            }
        }
        return String.join(" ", dep);
    }
}

 

posted @ 2019-03-02 21:35  JAYPARK01  阅读(172)  评论(0编辑  收藏  举报