leetcode1048

 1 class Solution:
 2     def __init__(self):
 3         self.dp = {}
 4 
 5     def backtrack(self,word,subword):
 6         self.dp[word] = max(self.dp[word],self.dp[subword]+1)
 7         for j in range(len(subword)):
 8             subword2 = subword[:j] + subword[j+1:]
 9             if subword2 in self.dp.keys() and self.dp[subword2] == 0:
10                 self.backtrack(subword,subword2)
11 
12     def longestStrChain(self, words: 'List[str]') -> int:
13         n = len(words)
14         words = sorted(words,key=lambda x:len(x))
15         for i in range(n):
16             word = words[i]
17             self.dp[word] = 0
18 
19         for word in self.dp.keys():
20             for j in range(len(word)):
21                 subword = word[:j] + word[j+1:]
22                 if subword in self.dp.keys():
23                     if self.dp[subword] == 0:
24                         self.backtrack(word,subword)
25                     else:
26                         self.dp[word] = max(self.dp[word],self.dp[subword]+1)
27             if self.dp[word] == 0:
28                 self.dp[word] = 1
29         return max(self.dp.values())

本题是思路是使用动态规划,dp是一个字典,其含义是:假设以某个string作为链的结尾时形成的链的最大长度。

因此最后dp的values中,最大的值就是输入列表所能形成的最长的链的长度。

 

转载于:https://www.cnblogs.com/asenyang/p/10928401.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值