Given string S
and a dictionary of words words
, find the number of words[i]
that is a subsequence of S
.
Example : Input: S = "abcde" words = ["a", "bb", "acd", "ace"] Output: 3 Explanation: There are three words inwords
that are a subsequence ofS
: "a", "acd", "ace".
Note:
- All words in
words
andS
will only consists of lowercase letters. - The length of
S
will be in the range of[1, 50000]
. - The length of
words
will be in the range of[1, 5000]
. - The length of
words[i]
will be in the range of[1, 50]
.
问S中有多少符合words里面的单词(可以不连续哦)
当然是二分啊,我们保存S中字母的位置,对于每个words我们都查找字母的位置,然后+1一位继续找
1 class Solution { 2 public: 3 int numMatchingSubseq(string S, vector<string>& words) { 4 int num=0; 5 vector<int>vec[50000]; 6 int len=S.size(); 7 for(int i=0;i<len;i++){ 8 vec[S[i]-'a'].push_back(i); 9 } 10 for(auto word:words){ 11 int add=0; 12 int wordLen=word.size(); 13 int flag=1; 14 // cout<<word<<endl; 15 for(int i=0;i<wordLen;i++){ 16 if(vec[word[i]-'a'].size()==0){ 17 flag=0; 18 break; 19 } 20 auto it=lower_bound(vec[word[i]-'a'].begin(),vec[word[i]-'a'].end(),add); 21 if(it==vec[word[i]-'a'].end()){ 22 flag=0; 23 break; 24 } 25 add=(*it); 26 add++; 27 // cout<<add<<endl; 28 } 29 if(flag){ 30 num++; 31 } 32 } 33 return num; 34 } 35 };