1 class Solution: 2 def __init__(self): 3 self.dic = {} 4 self.visited = {} 5 self.dp = [] 6 7 def backtrack(self,key,subkey): 8 if subkey in self.dic.keys(): 9 indx = self.dic[key] 10 sindx = self.dic[subkey] 11 self.dp[indx] = max(self.dp[indx],self.dp[sindx]+1) 12 for j in range(len(subkey)): 13 s2key = subkey[:j] + subkey[j+1:] 14 if s2key in self.visited.keys() and self.visited[s2key] == 0: 15 self.backtrack(subkey,s2key) 16 17 18 def longestStrChain(self, words: 'List[str]') -> int: 19 n = len(words) 20 self.dp.extend([1]*n) 21 words = sorted(words,key=lambda x:len(x)) 22 for i in range(n): 23 ary = sorted(words[i]) 24 word = ''.join(ary) 25 self.dic[word] = i 26 for key in self.dic.keys(): 27 self.visited[key] = 0 28 29 for key in self.dic.keys(): 30 for j in range(len(key)): 31 subkey = key[:j] + key[j+1:] 32 self.backtrack(key,subkey) 33 self.visited[key] = 1 34 35 return max(self.dp)
这个版本还不太完善,稍后再把代码简化一下吧。