792. 匹配子序列的单词数

题目链接

力扣

二分查找、

不会呀,还是看题解稍稍理解一点.

首先建立一个字符对应出现位置的二维表结构。

还是举例说明吧

例如 s = "abcddf"

word = "abdf"

假如第一次找到字符a在s中出现的位置是0,则下一个字符也就是b字符只能出现在1~5,(因为word是s的子串要保持先后顺序不变。)因此记录下这个下标也就是0,然后再在b字符对应的下标数组中寻找大于0的下标,也就是出现在a之后的字符。如果有则继续执行,如果没有(it==end())就说明此单词不是s的子串。

class Solution {
public:
    int numMatchingSubseq(string s, vector<string>& words) {
        vector<vector<int>> ps(26);
        for(int i=0;i<s.size();i++)
        {
            ps[s[i]-'a'].push_back(i);
        }//存储每一个字符在s中的位置
        int res = words.size();
        for (int i = 0; i < words.size(); i++)
        {
           auto tmp = words[i];
           if(tmp.size()>s.size())
           {
            res--;
            continue;

           }
           int cur= -1;
           for(char c : tmp)
           {
            auto it=upper_bound(ps[c-'a'].begin(),ps[c-'a'].end(),cur);
            if(it==ps[c-'a'].end())//如果没找到
            {
                res--;
                break;

            }
            cur=*it;

           }
        }
        

return res;
    }
};

这里有一个内置二分查找函数upper_bound()

upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

更多c++二分查找函数

C++——关于lower_bound( )和upper_bound( )的常见用法_xiaonuolen的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值