首页 > 其他分享 >力扣---1048. 最长字符串链

力扣---1048. 最长字符串链

时间:2023-04-27 19:12:10浏览次数:45  
标签:--- int 1048 力扣 ++ length words 单词 dp

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

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

例如,"abc" 是 "abac" 的 前身 ,而 "cba" 不是 "bcad" 的 前身
词链是单词 [word_1, word_2, ..., word_k] 组成的序列,k >= 1,其中 word1 是 word2 的前身,word2 是 word3 的前身,依此类推。一个单词通常是 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] 仅由小写英文字母组成。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-string-chain
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


 

最近咋感觉都是动规题。

由于符合要求的两个字符串 s1 和 s2 ,两者的长度差一定为 1 。

则可以想到,以 s2 为结尾的最长字符串链,一定是以 s1 为结尾的最长字符串链的长度加一。

class Solution {
    public int longestStrChain (String[] words) {
        int res = 0;
        Arrays.sort(words, (a, b) -> (a.length() - b.length()));
        int[] dp = new int[words.length];
        for (int i = 0; i < words.length; i++) {
            for (int j = 0; j < i; j++) {
                if (judge(words[j], words[i])) {
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                }
            }
            res = Math.max(res, dp[i]);
        }
        return res + 1;
    }

    private boolean judge (String str1, String str2) {
        int len1 = str1.length();
        int len2 = str2.length();
        if (len1 + 1 != len2) {
            return false;
        }
        int i = 0;
        int j = 0;
        while (i < len1 && j < len2) {
            while (j < len2 && str2.charAt(j) != str1.charAt(i)) {
                j++;
            }
            i++;
            j++;
        }
        return i == str1.length() && j <= len2;
    }
}

 

标签:---,int,1048,力扣,++,length,words,单词,dp
From: https://www.cnblogs.com/allWu/p/17359987.html

相关文章

  • python+playwright 学习-59 设置默认允许麦克风和摄像头等权限
    前言有些场景在使用的时候,会弹出一些权限框,比如麦克风和摄像头等,通过监听alert是没法捕获的。正确做法是给浏览器设置默认允许麦克风和摄像头等权限,不让弹窗出来。使用context的grant_permissions方法加权限。权限框弹窗示例这种弹窗是权限窗,不是alert解决办法contex......
  • 今日报告-66
    今日打卡所花时间(包括上课):2h代码量(行):50发表博客:1篇(不包括本篇)学习进度和了解到的知识点:今天学习了一些知识。今天开始参考了一下ajax,用以改进我们的项目,这些东西亟需学习。......
  • 关于sap-hana-数据库-在pacemaker集群中迁移主控节点-master节点
    环境介绍,hana数据库的两个节点:azphxxxdb01azphxxxdb02目前master位于azphxxxdb02,现在需要切换回azphxxxdb01 需要确保Pacemaker没有任何失败的操作(通过pcs状态检查)、没有任何意外的位置约束(例如迁移测试的遗留内容),并且HANA处于同步状态,例如,使用systemReplicationStat......
  • iic-2023-04-27
    1、时序构成可参见《12-IIC协议介绍2》的12:12往后的地方。 2、读写过程可参见《4分钟看懂!I2C通讯协议最简单的总线通讯!》,图片内容来自上述视频,首先需要指出的是,读数据时,发出第二次起始位+设备地址+读控制位后面没有应答信号,这个可以从立创商城英锐芯下载的AT24C02手册的“随机......
  • java面试题--JMM
    一、说一下JAVA内存模型JMM分为哪几个区域?堆(GC堆):GC的主要区域。存放的是对象实例。 线程共享区域。方法区:也称为元数据区。存放是类的信息,包括类的类型,字段信息,方法信息等。线程共享区域。本地方法栈:存放native方法。线程私有区域。虚拟机栈:线程私有区域。程序计数器:线程......
  • 字节前端--深入JS
    首先先介绍JS的基本概念:比如是单线程,动态,弱类型等等。除了这些东西之外还有:下面的一些基础概念:JavaScript是一种脚本语言,通常在网页上运行。JavaScript不需要编译,因为它是一种解释性语言。在网页上添加JavaScript的方式有多种,包括内联脚本、嵌入式脚本和外部脚本。......
  • MySQL----日期相关
    获取当前日期selectcurdate();结果: 2023-04-27获取当前日期为几号selectday(curdate())结果:27在当前日期上加上时间间隔selectDATE_ADD(curdate(),interval2day)结果:2023-04-29一、获取本月第一天selectDATE_ADD(curdate(),interval-day(curdate())+1day)--获取本......
  • Python-集合的基本操作(set)
    1. 前言python中的集合和数学里的类似也是用于存放不重复的元素,它有可变集合(set)和不可变集合(feozenset)两种,集合的所有元素都放在一对大括号"{}"里(列表是[]、元组是()、字典是{}),集合最好的应用就是去重,因为集合中的每一个元素都是唯一的。 2. 集合的创建2.1.直接使用"{}"创......
  • cesium-2-entity
    1、四层结构viewer-->datasources(DataSourceCollection类型)-->datasource-->entities(EntityCollection类型)-->entity需要学习的方向是:只需要注意每个层与层之间的关系和entity实例如何创建即可2、DataSourceCollection增:add(dataSource)→Promise.<DataSourc......
  • x86-64 C Calling Convention
    ASM层面的例程调用在x86-64中,指令集本身提供了用于实现子例程调用(函数调用)的一些指令。其它指令集架构,如risc-v、arm,也都提供了这些指令。x86-64以4条核心指令提供了一个调用栈的模型,以实现子例程调用。push指令语法pushpushpush语义push指令将它的操作数放在内存......