给定字符串 s 和字符串数组 words, 返回 words[i] 中是s的子序列的单词个数 。
字符串的 子序列 是从原始字符串中生成的新字符串,可以从中删去一些字符(可以是none),而不改变其余字符的相对顺序。
· 例如, “ace” 是 “abcde” 的子序列。
示例 1:
输入: s = “abcde”, words = [“a”,“bb”,“acd”,“ace”]
输出: 3
解释: 有三个是 s 的子序列的单词: “a”, “acd”, “ace”。
基本上是面向样例编程。。。
一开始就想到用正则匹配秒,没想到超时了。然后换了几次算法,最终根据超时样例的规律,设计用map记录的信息,终于过了。
class Solution:
def numMatchingSubseq(self, s: str, words: List[str]) -> int:
s_letter_info_map = {}
word_info_map = {}
for i,letter in enumerate(s):
if(letter not in s_letter_info_map): s_letter_info_map[letter] = []
s_letter_info_map[letter].append(i)
words_num = 0
for word in words:
if(word in word_info_map):
words_num += 1
continue
found_flag = True
head = -1
for letter in word:
if(letter not in s_letter_info_map):
found_flag = False
break
pos_found = False
for pos in s_letter_info_map[letter]:
if(pos <= head): continue
head = pos
pos_found = True
break
if(not pos_found):
found_flag = False
break
if(not found_flag): continue
words_num += 1
word_info_map[word] = True
return words_num