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;
    }
};


相关文章
|
8月前
leetcode-1518:换酒问题
leetcode-1518:换酒问题
36 0
|
8月前
|
Java
leetcode-474:一和零
leetcode-474:一和零
43 0
|
8月前
|
消息中间件 Kubernetes NoSQL
LeetCode 3、28、1351
LeetCode 3、28、1351
|
8月前
|
消息中间件 Kubernetes NoSQL
LeetCode 1359、1360
LeetCode 1359、1360
|
测试技术
一和零(LeetCode-474)
一和零(LeetCode-474)
144 0
一和零(LeetCode-474)
leetcode第38题
难在了题目是什么意思呢? 初始值第一行是 1。 第二行读第一行,1 个 1,去掉个字,所以第二行就是 11。 第三行读第二行,2 个 1,去掉个字,所以第三行就是 21。 第四行读第三行,1 个 2,1 个 1,去掉所有个字,所以第四行就是 1211。 第五行读第四行,1 个 1,1 个 2,2 个 1,去掉所有个字,所以第五航就是 111221。 第六行读第五行,3 个 1,2 个 2,1 个 1,去掉所以个字,所以第六行就是 312
leetcode第38题
|
机器学习/深度学习
leetcode第50题
求幂次方,用最简单的想法,就是写一个 for 循环累乘。 至于求负幂次方,比如 2^{-10}2−10,可以先求出 2^{10}210,然后取倒数,1/2^{10}1/210 ,就可以了 double mul = 1; if (n > 0) { for (int i = 0; i < n; i++) { mul *= x; } } else { n = -n; for (int i = 0; i < n; i++) { mul *= x; } mul = 1 / mul; }
104 0
leetcode第50题
leetcode第46题
这是自己开始想到的一个方法,考虑的思路是,先考虑小问题怎么解决,然后再利用小问题去解决大问题。没错,就是递归的思路。比如说, 如果只有 1 个数字 [ 1 ],那么很简单,直接返回 [ [ 1 ] ] 就 OK 了。 如果加了 1 个数字 2, [ 1 2 ] 该怎么办呢?我们只需要在上边的情况里,在 1 的空隙,也就是左边右边插入 2 就够了。变成 [ [ 2 1 ], [ 1 2 ] ]。
leetcode第46题
|
算法
leetcode第32题
这几种算法,暴力破解和动态规划我觉得想的话,还是能分析出来的话,最后两种算法感觉是去挖掘题的本质得到的算法,普适性不是很强。但最后一种算法,从左到右,从右到左,是真的强。
110 0
leetcode第32题