题名:匹配子序列的数量
难度:medium
题目描述如下:
题目分析:
该题要求在一堆words里面找出是字符串S子序列的字符串数目,如果简单地在遍历S的基础上,再遍历words里的每个字符串则会导致超时。我们可以“跟踪”words中每个字符串的“进度”: vector< pair<int,int> > v[128],pair的first代表words第几个字符串,second则表示该字符串目前期望的字符的序号,v本身的序号则由字符来决定。
例如:words = ["a", "bb", "acd"],初始化时,"a"是words的第0个字符串,它期望的字符是它的第0个字符,也就是'a',有v['a'].push_back = pair<int,int>(0, 0)。
代码如下:
class Solution {
public:
int numMatchingSubseq(string S, vector<string>& words) {
vector< pair<int,int> > v[128];
for(int i = 0; i < words.size(); i++){ //初始化,期望第0个字符
v[words[i][0]].push_back( pair<int,int>(i, 0) );
}
for(int i = 0; i < S.size(); i++){ //出现字符S[i]
vector< pair<int,int> > w = v[S[i]];
v[S[i]].clear(); //清空原先在期望字符S[i]的队伍
for(int j = 0; j < w.size(); j++){ //将这些字符串的进度更新,移入下一个期望字符的队伍
int m = w[j].first, n = w[j].second + 1;
v[words[m][n]].push_back( pair<int,int>(m, n) );
}
}
return v[0].size();
}
};