leetcode-472. 连接词

简介: leetcode-472. 连接词

题目

题目连接

给你一个 不含重复 单词的字符串数组 words ,请你找出并返回 words 中的所有 连接词 。

连接词 定义为:一个完全由给定数组中的至少两个较短单词组成的字符串。

示例 1:

输入:words = ["cat","cats","catsdogcats","dog","dogcatsdog","hippopotamuses","rat","ratcatdogcat"]
输出:["catsdogcats","dogcatsdog","ratcatdogcat"]
解释:"catsdogcats" 由 "cats", "dog" 和 "cats" 组成; 
     "dogcatsdog" 由 "dog", "cats" 和 "dog" 组成; 
     "ratcatdogcat" 由 "rat", "cat", "dog" 和 "cat" 组成。

示例 2:

输入:words = ["cat","dog","catdog"]
输出:["catdog"]

解题

方法一:字典树+深度优先搜索

参考链接

//定义字典树
class Trie{
public:
    bool isEnd;
    vector<Trie*> next;
    Trie(){
        this->isEnd=false;
        this->next=vector<Trie*>(26,nullptr);
    };
};
class Solution {
public:
    Trie* trie=new Trie();
    vector<string> findAllConcatenatedWordsInADict(vector<string>& words) {
        vector<string> res;
        //排序,保证字数少的在前面
        sort(words.begin(), words.end(), [](string& a,string& b){
            return a.size() < b.size(); 
        });
        //遍历words,如果是连接词就加入res,否则加入字典树
        for(string& word:words){
            if(word.size()==0) continue;
            if(dfs(word,0)){//深度优先,递归判断是否为连接词
                res.push_back(word);//加入结果
            }
            else insert(word);//插入字典树
        }
        return res;
    }
    bool dfs(string& word,int startIndex){
        if(startIndex==word.size()) return true;
        Trie* node=trie;
        for(int i=startIndex;i<word.size();i++){
            char c=word[i];
            node=node->next[c-'a'];
            if(node==nullptr) return false;
            if(node->isEnd){
                if(dfs(word,i+1)) return true;
            }
        }
        return false;
    }
    //插入字典树
    void insert(string& word){
        Trie* node=trie;
        for(char c:word){
            if(node->next[c-'a']==nullptr){
                node->next[c-'a']=new Trie();
            }
            node=node->next[c-'a'];
        }
        node->isEnd=true;
    }
};


相关文章
|
1月前
【LeetCode 02】暴力法总结
【LeetCode 02】暴力法总结
15 1
|
6月前
|
Java
leetcode-474:一和零
leetcode-474:一和零
39 0
|
6月前
|
消息中间件 Kubernetes NoSQL
LeetCode 3、28、1351
LeetCode 3、28、1351
|
存储
leetcode:53.最大字序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
53 0
顺手牵羊(LeetCode844.)
好多同学说这是双指针法,但是我认为叫它顺手牵羊法更合适
78 0
|
存储 Python
LeetCode 66. Plus One
给定表示非负整数的非空数字数组,加上整数的1。 存储数字使得最高有效数字位于列表的开头,并且数组中的每个元素包含单个数字。 您可以假设整数不包含任何前导零,除了数字0本身。
92 0
LeetCode 66. Plus One
|
算法
LeetCode——944. 删列造序
LeetCode——944. 删列造序
108 0
|
C++ Python
LeetCode 771. Jewels and Stones
LeetCode 771. Jewels and Stones
80 0
|
算法
leetcode第34题
第二种思路,参考这里。 我们开始更新 start 的时候,是 mid + 1,如果剩两个元素,例如 2 4,target = 6 的话,此时 mid = 0,start = mid + 1 = 1,我们返回 start + 1 = 2。如果 mid 是右端点,那么 mid = 1,start = mid + 1 = 2,这样就可以直接返回 start 了,不需要在返回的时候加 1 了。
104 0
leetcode第34题