【1048. 最长字符串链】

news2024/12/25 22:37:48

来源:力扣(LeetCode)

描述:

给出一个单词数组 words ,其中每个单词都由小写英文字母组成。

如果我们可以 不改变其他字符的顺序 ,在 wordA 的任何地方添加 恰好一个 字母使其变成 wordB ,那么我们认为 wordAwordB前身

  • 例如,"abc""abac"前身 ,而 "cba" 不是 "bcad"前身

词链是单词 [word_1, word_2, ..., word_k] 组成的序列,k >= 1,其中 word1word2 的前身,word2word3 的前身,依此类推。一个单词通常是 k == 1单词链

从给定单词列表 words 中选择单词组成词链,返回 词链的 最长可能长度

示例 1:

输入:words = ["a","b","ba","bca","bda","bdca"]
输出:4
解释:最长单词链之一为 ["a","ba","bda","bdca"]

示例 2:

输入:words = ["xbc","pcxbcf","xb","cxbc","pcxbc"]
输出:5
解释:所有的单词都可以放入单词链 ["xb", "xbc", "cxbc", "pcxbc", "pcxbcf"].

示例 3:

输入:words = ["abcd","dbqca"]
输出:1
解释:字链["abcd"]是最长的字链之一。
["abcd""dbqca"]不是一个有效的单词链,因为字母的顺序被改变了。

提示:

  • 1 <= words.length <= 1000
  • 1 <= words[i].length <= 16
  • words[i] 仅由小写英文字母组成。

方法:动态规划

思路与算法

根据题意可知,对于字符串「前身」的定义为:

  • 不改变其他字符的顺序 ,在 wordA 的任何地方添加恰好一个字母使其变成 wordB,那么我们认为 wordA 是 wordB 的前身。
  • 将 wordB 中去掉任意一个字母,其余字符保持不变构成的字符串即为 wordB 的前身。

因此对于每个字符串 s,假设其所有的前身 s′ 为结尾的最长链的长度为 l,即可知道以 s 为结尾的最长链的长度为 l + 1。为保证我们求 s 的最长链时,其所有的前身的最长链的长度均已求出,需要将所有的字符串按照长度大小进行排序。假设字符串 s 最长链的长度为 cnt(s) 的前身为 s′0,s′1, s′2, ⋯, s′k ,则此时可以知道

1

根据以上结论,实际计算过程如下:

  • 首先对字符串数组 words 按照字符串长度的大小进行排序;
  • 依次遍历每个字符串 words[i],并初始以 words[i] 为结尾的最长链的长度 cnt[words[i]] 为 1;
  • 依次尝试去掉 words[i] 中的每个字符,并构成其可能的前身 prev,在哈希表 cnt 查找 prev 对应的最长链长度,如果 cnt + 1 大于 cnt[words[i]],则更新 cnt[words[i]];
  • 最终返回可能的最长链的长度即可。

代码:

class Solution {
public:
    int longestStrChain(vector<string>& words) {
        unordered_map<string, int> cnt;
        sort(words.begin(), words.end(), [](const string &a, const string &b) {
            return a.size() < b.size();
        });
        int res = 0;
        for (string word : words) {
            cnt[word] = 1;
            for (int i = 0; i < word.size(); i++) {
                string prev = word.substr(0, i) + word.substr(i + 1);
                if (cnt.count(prev)) {
                    cnt[word] = max(cnt[word], cnt[prev] + 1);
                }
            }
            res = max(res, cnt[word]);
        }
        return res;
    }
};

执行用时:52 ms, 在所有 C++ 提交中击败了86.72%的用户
内存消耗:17 MB, 在所有 C++ 提交中击败了43.86%的用户
复杂度分析
时间复杂度:O(n×m×(logn+m)),其中 n 表示字符串数组的长度,m 表示每个字符串的平均长度。首选对字符串数组进行排序,需要的时间为 O(n×m×logn),然后遍历每个字符串,并对每个字符串都生成其「前身」字符串,需要的时间为 O(n×m2),因此总的时间复杂度为 O(n×m×(logn+m))。
空间复杂度:O(n×m),其中 n 表示字符串数组的长度,m 表示每个字符串的平均长度。需要存储以每个字符串为结尾的最大链的长度,一共有 n 个字符串,每个字符串的平均长度为 m,因此需要的空间为 O(n×m)。
author:LeetCode-Solution

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/466709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AI】Python 安装时启用长路径支持

文章目录 场景&#xff1a;解释&#xff1a;关于文件长路径&#xff1a;计算方法&#xff1a; 场景&#xff1a; Python 安装时&#xff0c;会出现 Disable path length limit 的提示。 解释&#xff1a; 在 Windows 操作系统中&#xff0c;文件路径的长度是有限制的。在早期…

连续Hopfield神经网络的优化——旅行商问题优化计算

连续Hopfield神经网络 连续Hopfield神经网络&#xff08;Continuous Hopfield Network, CHN&#xff09;是一种基于能量最小化原理的神经网络模型&#xff0c;与离散Hopfield网络相比&#xff0c;它的状态是连续的&#xff0c;典型地采用实数值或者概率分布。在优化连续Hopfie…

各大外卖平台占据共享经济市场主要份额,占比近50%

哈喽大家好&#xff0c;随着大量互联网用户和移动支付的普及、大量用户通过共享平台将闲置资源和服务与需求方进行匹配&#xff0c;实现了资源的高效利用和消费者福利的提升。在全球化驱动的新型消费需求以及政策支持下&#xff0c;共享经济正在向更加成熟和规范化的方向发展。…

【生态环境保护】绿水青山就是金山银山——生态环保篇

环保是一个持续性的话题&#xff0c;不仅仅是在国内&#xff0c;整个世界都是一个命运共同体从城市垃圾分类&#xff0c;到农村/村镇污水治理&#xff0c;城乡一体化和因地制宜的实施方式&#xff0c;是我们一直在探索的。 从余村到全国&#xff0c;从中国到世界&#xff0c;“…

网络安全合规-数据安全治理体系建设

一、数据安全治理体系建设思路&#xff1a; 一级文档。由决策层认可、面向组织的数据安全方针&#xff0c;通常应包括组织数据安全工作的总体目标、基本原则、数据安全决策机构设置与职责划分等。 二级文档。根据数据安全方针的要求&#xff0c;对组织数据安全工作各关键领域的…

黑客攻击的心理学:了解黑客的行为背后隐藏的心理因素

第一章&#xff1a;引言 在当今数字时代&#xff0c;网络已经成为人们交流、信息传递、商业活动的主要方式之一。但随之而来的是网络安全问题的不断浮现&#xff0c;其中最为突出的就是黑客攻击。黑客攻击不仅仅是技术问题&#xff0c;还涉及到心理学、社会学等多方面因素。了…

LoRA 理解

LLM的参数量对于时间和显存要求都带来很大的挑战。现存的两种显著范式: 增加adapter&#xff1a;主要问题在于推理时带来的额外计算量和延迟。优化prompt&#xff1a; 前缀微调(Prefix Tuning)较难优化&#xff0c;而且随着参数量增长性能并非单调变化。 那有什么方法可以 解…

一篇简单的文章带你玩转SpringBoot 之定时任务详解

序言 使用SpringBoot创建定时任务非常简单&#xff0c;目前主要有以下三种创建方式&#xff1a; 一、基于注解(Scheduled)二、基于接口&#xff08;SchedulingConfigurer&#xff09; 前者相信大家都很熟悉&#xff0c;但是实际使用中我们往往想从数据库中读取指定时间来动态…

Linux网络编程TCP连接的建立和终止

文章目录 前言一、TCP的三路握手二、TCP连接终止总结 前言 本篇文章将讲解TCP的连接的建立和终止&#xff0c;主要就是讲解TCP的三路握手和TCP连接断开内部发生的一些机制和事件。 一、TCP的三路握手 TCP三路握手所交换的三个分节&#xff1a; (1)服务器必须准备好接受外来…

C++题解之对顶堆:中位数

中位数 题目链接&#xff1a;洛谷P1168 中位数 题目描述 给定一个长度为 N N N 的非负整数序列 A A A&#xff0c;对于前奇数项求中位数。 输入格式 第一行一个正整数 N N N。 第二行 N N N 个正整数 A 1 … N A_{1\dots N} A1…N​。 输出格式 共 ⌊ N 1 2 ⌋ …

【是C++,不是C艹】 省缺参数 | 函数重载 | 内联函数

&#x1f49e;&#x1f49e;欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e; &#x1f449; 专栏&#xff1a;《是C&#xff0c;不是C艹》&#x1f448; 前言&#xff1a; 上期&#xff0c;我带大家给C打了招呼&#xff0c;捎带着认识了命名空间和输入输出&#xff0c;那…

LeetCode——链表简单题题解

83. 删除排序链表中的重复元素 题目描述 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2] 解题思路&#xff1a;用一个指向节点类型的指针保…

Vscode配置C/C++开发环境

下载Vscode进行安装。 下载MinGW-W64 GCC最新版本&#xff0c; 选择x86_64-win32-seh进行下载。解压放入自定义目录&#xff08;英文路径&#xff09;后&#xff0c;添加$:\mingw64\bin到系统Path环境变量。安装C/C插件。 在.c后缀文件中按Ctr Shift P&#xff0c;选择C/C …

Windows系统文件被faust勒索病毒加密勒索病毒解密恢复,电脑中病毒了怎么修复?

恶意软件的攻击已经让电脑用户变得更加谨慎了。在最近的一波攻击中&#xff0c;faust勒索病毒已经对使用Windows系统的计算机造成了广泛的破坏。该病毒利用加密技术锁定用户的文件&#xff0c;只有在支付一定数额的赎金后才会解锁这些文件。如果你的计算机中也受到了这种勒索病…

MaxScript编写bone转换biped工具

一、制作转换工具的缘由 大家好&#xff0c;我是阿赵。我经常从各种渠道得到了一些角色模型&#xff0c;这些模型得到之后&#xff0c;会发现是带有蒙皮和骨骼&#xff0c;甚至带有动作的。   不过这些资源很多都是从游戏截取出来的&#xff0c;导入到3DsMax之后&#xff0c;…

信息安全复习十:Web与电子商务安全

一、章节梗概 1.信息安全的学科内容 2.Web和电子商务安全问题提出 3.安全套接字协议SSL与传输层安全协议TLS 4.安全电子交易(SET)简要介绍 复习&#xff1a; 密码学内容&#xff1a;对称密钥密码、公开密钥密码、报文鉴别 PKI&#xff1a;数字签名、数字证书、信任关系 身份认…

MES管理系统助力企业数字化与实体经济实现“数实融合“

中国企业评估协会日前公布了2022年度“中国新经济500强”的名单。在这些企业中&#xff0c;先进制造业企业的比例超过了半数&#xff0c;尤其是互联网与现代信息技术服务业、新能源产业、新型生活性服务业等&#xff0c;在这些行业中占据了重要地位。由此可以看出&#xff0c;绿…

C/C++每日一练(20230427) 二叉树专场(5)

目录 1. 从中序与后序遍历序列构造二叉树 &#x1f31f;&#x1f31f; 2. 从先序与中序遍历序列构造二叉树 &#x1f31f;&#x1f31f; 3. 二叉树展开为链表 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每…

微信小程序php+python+nodejs+vue 高校工资管理系统

在线公益知识练习及测试系统是随着计算机技术和互联网技术的发展而产生的一种的新的练习及测试模式&#xff0c;与传统的纸质化练习及测试不同&#xff0c;在线系统提高了练习或测试的效率&#xff0c;减少了纸张的浪费&#xff0c;减轻了教师的评卷压力&#xff0c;同时也为参…

易观千帆 | 金融机构如何保证用户体验长期可持续?

易观&#xff1a;用户体验正逐渐成为金融机构的命脉。 数字经济时代的到来&#xff0c;金融机构面临着来自内部和外部的双重压力。一方面&#xff0c;互联网金融企业凭借强大的技术能力以及人才优势&#xff0c;通过互联网运营的模式迅速响应客户需求&#xff0c;吸引了大量用户…