動機
類似word break去硬幹
Problem
Given an array of strings words
representing an English Dictionary, return the longest word in words
that can be built one character at a time by other words in words
.
If there is more than one possible answer, return the longest word with the smallest lexicographical order. If there is no answer, return the empty string.
Example 1:
Input: words = [w,wo,wor,worl,world]Output: worldExplanation: The word world can be built one character at a time by w, wo, wor, and worl.
Example 2:
Input: words = [a,banana,app,appl,ap,apply,apple]Output: appleExplanation: Both apply and apple can be built from other words in the dictionary. However, apple is lexicographically smaller than apply.
Constraints:
1 <= words.length <= 1000
1 <= words[i].length <= 30
words[i]
consists of lowercase English letters.
Sol
不過如果要用bisect在string上就只能sort而已,不能調其他東西
class Solution:
def longestWord(self, words: List[str]) -> str:
words.sort()
ret = ""
for s in reversed(words):
good = True
for j in range(len(s)-1):
k = bisect_left(words,s[:j+1])
if k >= len(words) or 0 > k or words[k] != s[:j+1]:
#print("fail for", words[k] if 0<= k < len(words) else None ,s[:j+1])
good = False
break
ret = s if good and len(s) >= len(ret) else ret
return ret