74th LeetCode Weekly Contest Valid Number of Matching Subsequences

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 in words that are a subsequence of S: "a", "acd", "ace".

Note:

  • All words in words and S 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 };
原文地址:https://www.cnblogs.com/yinghualuowu/p/8516244.html