【每日一题Day189】LC1048最长字符串链 | dp+排序

简介: 【每日一题Day189】LC1048最长字符串链 | dp+排序

最长字符串链【LC1048】

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

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

wordB ,那么我们认为 wordAwordB前身

  • 例如,"abc""abac"前身 ,而 "cba" 不是 "bcad"前身
  • 词链是单词 [word_1, word_2, ..., word_k] 组成的序列,k >= 1,其中 word1word2 的前身,word2word3 的前身,依此类推。一个单词通常是 k == 1单词链

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


到家啦 happy

  • 思路
    某个单词的前身单词的长度一定比该单词少1,因此可以将单词根据长度升序排列。然后通过动态规划找到词链的最长长度,定义dp[i]为以words[i]为词链末尾的最长词链长度,如果words[j]是words[i]的前身,那么判断是否需要更新dp[i]。
  • 实现
class Solution {
    public int longestStrChain(String[] words) {
        Arrays.sort(words, (o1, o2) -> o1.length() - o2.length());
        int n = words.length;
        int[] dp = new int[n];
        Arrays.fill(dp, 1);
        int res = 0;
        for (int i = 0; i < n; i++){
            for (int j = 0; j < i; j++){
                if (isPredecessor(words[i], words[j])){
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                }          
            }
            res = Math.max(res, dp[i]);
        }
        return res;
    }
    // 判断s2是否是s1的前身
    public boolean isPredecessor(String s1, String s2){
        int n = s1.length(), m = s2.length();
        if (n != m + 1) return false;
        int i = 0, j = 0;
        while (i < n && j < m){
            if (s1.charAt(i) == s2.charAt(j)){
                j++;
            }
            i++;
        }
        return j == m;
    }
}

image.png

目录
相关文章
|
6月前
【每日一题Day211】LC1079活字印刷 | 回溯 计数dp
【每日一题Day211】LC1079活字印刷 | 回溯 计数dp
54 0
|
6月前
|
索引
【每日一题Day183】LC1187使数组严格递增 | dp
【每日一题Day183】LC1187使数组严格递增 | dp
42 0
|
6月前
【每日一题Day357】LC1155掷骰子等于目标和的方法数 | dp
【每日一题Day357】LC1155掷骰子等于目标和的方法数 | dp
56 0
|
6月前
【每日一题Day159】LC1638统计只差一个字符的子串数目 | 枚举
【每日一题Day159】LC1638统计只差一个字符的子串数目 | 枚举
37 0
|
6月前
【每日一题Day225】LC2559统计范围内的元音字符串数 | 前缀和 二分查找
【每日一题Day225】LC2559统计范围内的元音字符串数 | 前缀和 二分查找
48 0
|
算法
【代码随想录】LC 209. 长度最小的子数组
利用两层循环,第一层循环枚举子数组的起点位置,第二层循环枚举子数组的终点位置,第二层循环中可以同时来统计当前子数组的和,如果符合题目条件则更新length,否则继续循环,直至两层循环结束,返回题目要求的值,算法结束。
58 0
|
5月前
|
机器学习/深度学习 人工智能 JavaScript
技术心得记录:最长公共子序列(LCS)详解+例题模板(全)(转)
技术心得记录:最长公共子序列(LCS)详解+例题模板(全)(转)
|
6月前
【每日一题Day278】LC2500删除每行中的最大值 | 排序+模拟
【每日一题Day278】LC2500删除每行中的最大值 | 排序+模拟
47 0
|
6月前
【每日一题Day160】LC1092最短公共超序列 | 动态规划
【每日一题Day160】LC1092最短公共超序列 | 动态规划
40 0
【每日一题Day160】LC1092最短公共超序列 | 动态规划
|
6月前
【每日一题Day151】LC1625执行操作后字典序最小的字符串 | BFS
【每日一题Day151】LC1625执行操作后字典序最小的字符串 | BFS
37 0