给定字符串 S 和单词字典 words, 求 words[i] 中是 S 的子序列的单词个数。
示例
输入:
S = "abcde"
words = ["a", "bb", "acd", "ace"]
输出: 3
解释: 有三个是 S 的子序列的单词: "a", "acd", "ace"。
注意:
所有在words和 S 里的单词都只由小写字母组成。
S 的长度在 [1, 50000]。
words 的长度在 [1, 5000]。
words[i]的长度在[1, 50]。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-matching-subsequences
解法
因为S长度可能较长,如果将words中的每个单词w都和S比较,效率较低。
可以通过一次遍历提取S的特征,然后将S中的每个单词w和这个特征做比较。
提取特征的方法:使用charPos[][]记录S中每个单词出现的位置。charPos[i][]为字母('a' + i)在S中出现的所有位置的集合。
然后遍历words中的每个单词w,根据charPos[][]的位置信息确定是否匹配。
代码:
class Solution {
public:
int numMatchingSubseq(string S, vector<string>& words) {
// charPos[i]记录