LeetCode 1048. 最长字符串链

LeetCode 1048. 最长字符串链

文章目录

  • LeetCode 1048. 最长字符串链
  • 题目描述
  • 一、解题关键词
  • 二、解题报告
    • 1.思路分析
    • 2.时间复杂度
    • 3.代码示例
    • 2.知识点
  • 总结
  • 相同题目

题目描述

 给出一个单词数组 words ,其中每个单词都由小写英文字母组成。
如果我们可以 不改变其他字符的顺序 ,在 wordA 的任何地方添加 恰好一个 字母使其变成 wordB ,那么我们认为 wordA 是 wordB 的 前身 。
  例如,“abc” 是 “abac” 的 前身 ,而 “cba” 不是 “bcad” 的 前身
返回 词链的 最长可能长度 。
  示例 1:
  输入:words = [“a”,“b”,“ba”,“bca”,“bda”,“bdca”]
  输出:4
  解释:最长单词链之一为 [“a”,“ba”,“bda”,“bdca”]

1048. 最长字符串链
提示:

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

一、解题关键词

数组 words 、最长可能长度 、words[i] 仅由小写英文字母组成

二、解题报告

1.思路分析

1、最值问题 肯定要进行遍历比较
2、最大可能 需要存储比较结果
3、需要存储每次的比较结果 所以是动态规划问题
4、进行排序,排序之后进行比较且状态转移
5、返回最佳结果

2.时间复杂度

3.代码示例

class Solution {
    public int longestStrChain(String[] words) {
        Map<String,Integer> dp = new HashMap<>();
        Arrays.sort(words,(a,b)-> a.length() - b.length());
        int res = 0;
        for(String word : words){
            int maxLen = 0;
            for(int i= 0; i < word.length();i++){
                String prev = word.substring(0,i) + word.substring(i + 1);
                maxLen = Math.max(maxLen,dp.getOrDefault(prev,0) + 1);
            }
            dp.put(word,maxLen);
            res  = Math.max(res,maxLen);
        }
        return res;

    }
}

2.知识点



总结

相同题目

xxx

你可能感兴趣的:(LeetCode解题报告,动态规划,字符串,最值,java,算法)