LeetCode-472 连接词

本文涉及的产品
实时计算 Flink 版,1000CU*H 3个月
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: LeetCode-472 连接词

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/concatenated-words

题目描述

给你一个 不含重复 单词的字符串数组 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"]
提示:
1 <= words.length <= 104
0 <= words[i].length <= 1000
words[i] 仅由小写字母组成
0 <= sum(words[i].length) <= 105

解题思路

这道题还是挺复杂的,啃了一天才做出来。

首先要了解什么是字典树,字典树就是一棵前缀树,相同前缀的字符串会位于同一棵字典树的不同分支,本题主要思路就是先将所有单词按照单词长度升序排序。然后依次遍历单词,使用dfs的方法判断 单词是否是由字典树上的单词构成的,若是,则是连接词,如果不是,则将这个单词加入连接词。

字典树是一颗多叉树,这里没有用传统的多叉树的存储形式,而是在每个结点中使用了vector记录所有子树结点构成了一颗多叉树。结点中使用char来记录连接到这个结点的边,边的值就是字母。并且用一个标志位记录当前词在words中位置。

添加字典树结点的部分过程是从顶到底遍历字典树,并且遍历单词中每个字母,判断是否可以找到相同的路径使得路径上的字母和单词相同,如果没有就在分歧点新增入结点。

dfs过程则是利用深度优先找是否路径使得路径上的字母和单词相同的过程。

代码展示

 

class Solution {
public:
    class DictionaryTree
    {
    public:
        char mcEdge;
        int miEnd = -1;
        vector<DictionaryTree*> mvzChildren;
    };
    int AddDictionaryTreeNode(DictionaryTree* vzDictionaryTree, string s, int index)
    {
        DictionaryTree* p = vzDictionaryTree;
        for(auto c:s)
        {
            bool bFinded = false;
            for(int i = 0; i < p->mvzChildren.size(); i++)
            {
                if(p->mvzChildren[i]->mcEdge == c)
                {
                    p = p->mvzChildren[i];
                    bFinded = true;
                    break;
                }
            }
            if(!bFinded)
            {
                DictionaryTree* q = new DictionaryTree;
                q->mcEdge = c;
                p->mvzChildren.push_back(q);
                p = q;
            }
        }
        p->miEnd = index;
        return 0;
    }
    bool dfs(DictionaryTree* vzDictionaryTree, string s, int start)
    {
        if (s.length() == start) {
            return true;
        }
        DictionaryTree* p = vzDictionaryTree;
        for (int i = start; i < s.length(); i++) {
            char ch = s[i];
            bool bFind = false;
            int iIndex = 0;
            for(; iIndex < p->mvzChildren.size(); iIndex++)
            {
                if(p->mvzChildren[iIndex]->mcEdge == ch)
                {
                    bFind = true;
                    break;
                }
            }
            if (!bFind) {
                return false;
            }
            p = p->mvzChildren[iIndex];
            if (p->miEnd != -1) {
                if (dfs(vzDictionaryTree, s, i + 1)) 
                {
                    return true;
                }
            }
        }
        return false;
    }
    vector<string> findAllConcatenatedWordsInADict(vector<string>& words) {
        vector<string> vstrRet;
        sort(words.begin(), words.end(), [](string a, string b) -> bool { return a.size() < b.size();});
        DictionaryTree zDictionaryTree;
        for(int is = 0; is < words.size(); is++)
        {
            if(words[is].size() == 0)
                continue;
            if(dfs(&zDictionaryTree, words[is], 0))
            {
                vstrRet.push_back(words[is]);
            }
            else
            {
                AddDictionaryTreeNode(&zDictionaryTree, words[is], is);
            }
        }
        return vstrRet;
    }
};

运行结果

 

相关文章
|
存储 数据可视化 Serverless
使用蒙特卡罗模拟的投资组合优化
在金融市场中,优化投资组合对于实现风险与回报之间的预期平衡至关重要。蒙特卡罗模拟提供了一个强大的工具来评估不同的资产配置策略及其在不确定市场条件下的潜在结果。
690 1
|
存储
File操作 - list()/listFiles()与目录过滤器
File操作 - list()/listFiles()与目录过滤器
359 0
|
6月前
|
人工智能 搜索推荐 IDE
突破网页数据集获取难题:Web Unlocker API 助力 AI 训练与微调数据集全方位解决方案
本文介绍了Web Unlocker API、Web-Scraper和SERP API三大工具,助力解决AI训练与微调数据集获取难题。Web Unlocker API通过智能代理和CAPTCHA绕过技术,高效解锁高防护网站数据;Web-Scraper支持动态内容加载,精准抓取复杂网页信息;SERP API专注搜索引擎结果页数据抓取,适用于SEO分析与市场研究。这些工具大幅降低数据获取成本,提供合规保障,特别适合中小企业使用。粉丝专属体验入口提供2刀额度,助您轻松上手!
356 2
|
消息中间件 人工智能 Serverless
【云故事探索】NO.9:大洋彼岸的智能工具:劳动力管理,盖雅搞得定
在数字化转型浪潮中,云计算成为企业创新的核心驱动力。苏州盖雅信息技术有限公司(简称盖雅工场)作为劳动力管理领域的领军者,自2009年成立以来,服务全球29个国家和地区,客户达1800家,覆盖600万员工。通过与阿里云合作,盖雅利用云计算提升业务效率,实现服务移动化,并借助AI技术推动未来智能化发展。
441 12
【云故事探索】NO.9:大洋彼岸的智能工具:劳动力管理,盖雅搞得定
|
11月前
|
机器学习/深度学习 传感器 人工智能
数字孪生技术:智能建筑的新纪元
【10月更文挑战第31天】数字孪生技术正重新定义智能建筑的设计、建造和管理。通过在虚拟环境中创建与实际建筑一致的数字模型,实现实时监测、模拟和优化。本文探讨其在设计、施工、运营、应急管理和未来展望中的应用,展示其在建筑智能化管理中的巨大潜力。
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
人工智能与未来医疗:AI技术在疾病诊断中的应用前景####
本文探讨了人工智能(AI)在现代医疗领域,尤其是疾病诊断方面的应用潜力和前景。随着技术的不断进步,AI正逐渐改变传统医疗模式,提高诊断的准确性和效率。通过分析当前的技术趋势、具体案例以及面临的挑战,本文旨在为读者提供一个全面的视角,理解AI如何塑造未来医疗的面貌。 ####
|
机器人
RPA如何影响就业市场?
【8月更文挑战第4天】RPA如何影响就业市场?
232 7
|
计算机视觉 Python
10个使用NumPy就可以进行的图像处理步骤
这篇文章介绍了使用NumPy进行图像处理的10个基本步骤,包括读取图像、缩小图像、水平和垂直翻转、旋转、裁剪、分离RGB通道、应用滤镜(如棕褐色调)、灰度化、像素化、二值化以及图像融合。通过这些简单的操作,读者可以更好地掌握NumPy在图像处理中的应用。示例代码展示了如何实现这些效果,并配有图像结果。文章强调这些方法适合初学者,更复杂的图像处理可使用专门的库如OpenCV或Pillow。
397 5
|
网络虚拟化 网络架构
dis ip int brief命令的作用是什么?
dis ip int brief命令通常是指在设备上查看路由器或交换机接口的摘要信息。这个命令的目的是显示设备上所有接口的基本信息,包括接口的状态、IP地址、协议等。
|
机器学习/深度学习 人工智能 自动驾驶
世界模型有什么用?
【2月更文挑战第16天】世界模型有什么用?
330 2
世界模型有什么用?