Number of Matching Subsequences
Given stringSand a dictionary of wordswords, find the number ofwords[i]that is a subsequence ofS.
Example :
Input:
S = "abcde"
words = ["a", "bb", "acd", "ace"]
Output:
3
Explanation:
There are three words in
words
that are a subsequence of
S
: "a", "acd", "ace".Note:
All words in
wordsand
Swill only consists of lowercase letters.
The length of
Swill be in the range of
[1, 50000].
The length of
wordswill be in the range of
[1, 5000].
The length of
words[i]will be in the range of
[1, 50].
分析
类似Shortest Way to Form String,建立 Inverted index。在index list内就是存在,>= len(charlist)说明不在。同时curidx是在当前source的Pos,每次都要记得更新。
class Solution:
def shortestWay(self, s: str, t: str) -> int:
ii = collections.defaultdict(list) #invertedIndex
for idx, v in enumerate(s):
ii[v].append(idx)
loopcnt = 1
curidx = -1
for tidx, tv in enumerate(t):
if tv not in ii:
return -1
iidx = bisect.bisect_left(ii[tv],curidx)
if iidx >= len(ii[tv]):
loopcnt += 1
curidx = ii[tv][0] + 1
else:
curidx = ii[tv][iidx] + 1
return loopcntLast updated
Was this helpful?