# 792. 匹配子序列的单词数

给定字符串 s 和字符串数组 words, 返回 words [i] 中是 s 的子序列的单词个数 。

字符串的 子序列 是从原始字符串中生成的新字符串,可以从中删去一些字符 (可以是 none),而不改变其余字符的相对顺序。

  • 例如, “ace” 是 “abcde” 的子序列。

示例 1:

输入: s = "abcde", words = ["a","bb","acd","ace"]
输出: 3
解释: 有三个是 s 的子序列的单词: "a", "acd", "ace"。

示例 2:

输入: s = "dsahjpjauf", words = ["ahjpjau","ja","ahbwzgqnuk","tnmlanowax"]
输出: 2

提示:

  • 1 <= s.length <= 5 * $10^4$
  • 1 <= words.length <= 5000
  • 1 <= words[i].length <= 50
  • words [i] 和 s 都只由小写字母组成。

# 题解

class Solution {
public:
int numMatchingSubseq(string s, vector<string> &words) {
vector<vector<int>> pos(26);
for (int i = 0; i < s.size(); ++i) {
pos[s[i] - 'a'].push_back(i);
}
int res = words.size();
for (auto &w : words) {
if (w.size() > s.size()) {
--res;
continue;
}
int p = -1;
for (char c : w) {
auto &ps = pos[c - 'a'];
auto it = upper_bound(ps.begin(), ps.end(), p);
if (it == ps.end()) {
--res;
break;
}
p = *it;
}
}
return res;
}
};

复杂度分析

  • 时间复杂度:$O (\sum_i=0}{m-1size_i*log n)$
  • 空间复杂度:$O (n)$