-
Notifications
You must be signed in to change notification settings - Fork 613
/
1048.py
45 lines (34 loc) · 1.42 KB
/
1048.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
'''
Given a list of words, each word consists of English lowercase letters.
Let's say word1 is a predecessor of word2 if and only if we can add exactly one letter anywhere in word1 to make it equal to word2. For example, "abc" is a predecessor of "abac".
A word chain is a sequence of words [word_1, word_2, ..., word_k] with k >= 1, where word_1 is a predecessor of word_2, word_2 is a predecessor of word_3, and so on.
Return the longest possible length of a word chain with words chosen from the given list of words.
Example 1:
Input: ["a","b","ba","bca","bda","bdca"]
Output: 4
Explanation: one of the longest word chain is "a","ba","bda","bdca".
Note:
1 <= words.length <= 1000
1 <= words[i].length <= 16
words[i] only consists of English lowercase letters.
'''
class Solution(object):
def longestStrChain(self, words):
"""
:type words: List[str]
:rtype: int
"""
if not words:
return 0
words.sort(key=len)
dp = collections.defaultdict(int)
result = 0
for word in words:
for index in range(len(word)):
char_excluded_string = word[:index] + word[index+1:]
if char_excluded_string in dp:
dp[word] = max(dp[char_excluded_string]+1, dp[word])
else:
dp[word] = max(dp[word], 1)
result = max(dp[word], result)
return result