257. 最长字符串链

257. 最长字符串链

中文English

给出一个单词列表,其中每个单词都由小写英文字母组成。
如果我们可以在 word1 的任何地方添加一个字母使其变成 word2,那么我们认为 word1 是 word2 的前身。例如,"abc" 是 "abac" 的前身。
词链是单词 [word_1, word_2, ..., word_k] 组成的序列,k >= 1,其中 word_1 是 word_2 的前身,word_2 是 word_3 的前身,依此类推。
从给定单词列表 words 中选择单词组成词链,返回词链的最长可能长度。

样例

样例 1

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

注意事项

  1. 1 <= words.length <= 1000
  2. 1 <= words[i].length <= 16
  3. words[i] 仅由小写英文字母组成。
输入测试数据 (每行一个参数)如何理解测试数据?

 同向型双指针 + 动态规划 + sorted排序用法

class Solution:
    """
    @param words: the list of word.
    @return: the length of the longest string chain.
    """
    def longestStrChain(self, words):
        #动态规划,f[i] = max(f[j] + 1, f[i]) j也就是长度相差1的
        if not words: return 0 
        
        #初始化
        words = sorted(words, key = lambda x: len(x))

        length = len(words)
        dp = [1]*(length + 1)
        
        #计算顺序
        for i in range(1, length + 1):
            for j in range(1, i):
                #如果相差1
                if (len(words[i - 1]) - len(words[j - 1]) == 1) and (self.isSonStr(words[j - 1], words[i - 1])):
                    dp[i] = max(dp[j] + 1, dp[i])
        
        return max(dp)

    
    def isSonStr(self,str1, str2):
        left, right = 0, 0 
        #同向型双指针
        while right < len(str2):
            if str1[left] == str2[right]:
                left += 1
                right += 1
            else:
                right += 1 

           #当left指针指向最后,并且可以继续往最后下一个走的时候
            if (left == len(str1)):
                return True
        
        return False

 

posted @ 2020-06-27 11:28  风不再来  阅读(263)  评论(0编辑  收藏  举报