给定字符串 s 和字符串数组 words, 返回 words[i] 中是s的子序列的单词个数 。
字符串的 子序列 是从原始字符串中生成的新字符串,可以从中删去一些字符(可以是none),而不改变其余字符的相对顺序。
示例 1:
输入: s = “abcde”, words = [“a”,“bb”,“acd”,“ace”]
输出: 3
解释: 有三个是 s 的子序列的单词: “a”, “acd”, “ace”。
示例 2:
输入: s = “dsahjpjauf”, words = [“ahjpjau”,“ja”,“ahbwzgqnuk”,“tnmlanowax”]
输出: 2
提示:
我的想法:
肯定是暴力了
1.循环遍历 words ,搞个布尔型的 flag 初始值为False,再循环遍历每个单词.当对应的字符在 s 里的时候 flag = True,继续循环;
当对应的字符不在 s 里的时候 flag = False,跳出当前循环;
遍历完一个单词判断一下 flag ,当 flag 为 True 的时候,返回值 + 1。
return 返回值。
class Solution:
def numMatchingSubseq(self, s: str, words: List[str]) -> int:
returnnum = 0
for word in words:
flag = False
for c in word:
if c in s:
flag = True
else:
flag = False
break
if flag :
returnnum += 1
return returnnum
然后哈哈,测试案例都没过
解答错误 38 / 53 个通过的测试用例
输入 s = “abcde” words =[“a”,“bb”,“acd”,“ace”]
输出 4
预期结果 3
想了一下肯定是 words 中的 “bb” 不符合题意了。
2.进行改进
举个例子
s = “abcde”
word = “bb”
使用个 j,初始为0 判断第一个字符 b 在不在 s[j:]中,如果在的话,取出 s 中对应 b 字符的位置。并使用 j 存下,j += s[j:].index©
-abcde-
bb
这之后 j += 1,相当于指向了c
遍历到第二个字符 b 的时候,判断 b 在不在 s[j:] 中
ab -cde-
bb
发现不在,flag = False, 跳出循环
class Solution:
def numMatchingSubseq(self, s: str, words: List[str]) -> int:
returnnum = 0
for ch in words:
j = 0
flag = False
for c in ch:
if c in s[j:]:
j += s[j:].index(c)
flag = True
j += 1
continue
else:
flag = False
break
if flag :
returnnum += 1
return returnnum
就是有点慢,但是 ac 了
粘一下其他人的题解:
官方 - 二分查找/多指针