力扣(LeetCode)792. 匹配子序列的单词数(C++)

news2024/11/17 3:31:05

二分查找

直观思考,本题可以将 w o r d s words words 中每个单词 w o r d word word 依次和目标字符串 s s s 比较,检查是否为子串。时间复杂度 n × ∑ i = 0 m − 1 w o r d s i n\times \sum_{i=0}^{m-1}words_i n×i=0m1wordsi n n n s s s 的长度, m m m w o r d s words words 的长度,问题规模 1 0 11 10^{11} 1011 , T L E TLE TLE

注意到, s s s 中只有 26 26 26 个字母 , 类比哈希思想分桶,但是桶内键值对不唯一,就可以二分优化了。 a l p h a [ i ] alpha[i] alpha[i] 存储 i i i对应字母 的所有下标,那么 a l p h a alpha alpha 就存储了 26 26 26 个字母对应 s s s 的下标。只需一次遍历 s s s ,即可得到 a l p h a alpha alpha

二分如下:遍历所有单词 w o r d word word ,遍历单词的字母 c c c ,记录位置 p p p ,表示 c c c 在目标串 s s s 中的位置,二分查找桶中第一个大于 p p p 的位置 i t it it , 如果找到,则令 p p p 等于这个位置,可以继续匹配 ; 如果查找越界,说明桶中没有足够字母,可行解- -,提前 b r e a k break break

代码展示

class Solution {
public:
    int numMatchingSubseq(string s, vector<string>& words) {
        vector<vector<int>> alpha(26);
        for(int i = 0;i<s.size();i++) alpha[s[i]-'a'].emplace_back(i);//存所有s字母的下标//分了26个桶
        int ans = words.size();//初始认为所有word符合条件
        for(auto &word:words){//遍历words
            if(word.size()>s.size()){//剪枝
                ans--;
                continue;
            }
            int p = -1;//初始小于所有数//找第一个字符
            for(auto &c:word){
                auto &pos = alpha[c-'a'];//桶
                auto it = upper_bound(pos.begin(),pos.end(),p);//桶中第一个大于p的位置
                if(pos.end()==it){//查无此字母
                    ans--;
                    break;//剪枝
                }
                p = it[0];//下标更新
            }
        }
        return ans;
    }
};

博主致语

理解思路很重要!
欢迎读者在评论区留言,作为日更博主,看到就会回复的。

AC

AC

复杂度分析

  1. 时间复杂度: O ( l o g n × ∑ i = 0 m − 1 w o r d s i ) O(logn\times \sum_{i=0}^{m-1}words_i) O(logn×i=0m1wordsi) n n n s s s 的长度, m m m w o r d s words words 的长度。
  2. 空间复杂度: O ( n ) O(n) O(n) a l p h a alpha alpha 保存了 s s s 所有字母的下标, a l p h a alpha alpha 的空间复杂度 O ( n ) O(n) O(n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/11967.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

壁纸号的玩法,拿出来收费未免也太坑人了,所以,直接上教程。

网上关于斗音变现的攻略写得比较少&#xff0c;可以理解为目前仍是风口&#xff0c;都在闷声发大财&#xff0c;虽然我也做知识付费&#xff0c;但是这壁纸号的玩法&#xff0c;拿出来收费未免也太坑人了…… 所以&#xff0c;直接上教程…… 一、准备斗音号 这一块不用多说&…

数据结构之实现队列

文章目录前言1.队列的相关介绍1.队列的定义2.队列的实现方式2.队列具体实现1.队列声明定义2.队列的接口1.初始化接口2.数据的插入和删除3.获取队头元素和队尾元素4.获取队列元素个数和队列判空以及队列3.总结前言 之前谈到了栈的实现&#xff0c;现在来说说另一种数据结构——…

[hadoop全分布部署]虚拟机Hadoop集群配置/etc/hosts、配置无密码登录(SSH)

&#x1f468;‍&#x1f393;&#x1f468;‍&#x1f393;博主&#xff1a;发量不足 个人简介&#xff1a;耐心&#xff0c;自信来源于你强大的思想和知识基础&#xff01;&#xff01; &#x1f4d1;&#x1f4d1;本期更新内容&#xff1a;虚拟机Hadoop集群配置/etc/hosts…

Centos 7下安装php+mysql+nginx+wordpress教程新版

安装zsh+oh-my-zsh 安装zsh的原因是因为不喜欢自带的ssh工具,感觉没有这个好用,我最常用的就是记忆功能,比如输入某个字母,按上下键会自动补全已经使用过的命令,安装也很简单,一条命令搞定,他的扩展也很多,这里只讲最简单的安装,当然也可以不需要安装。 执行yum inst…

Linux基本指令

这一章我们将讲解在Linux系统下&#xff0c;一些基本指令的用法和功能. 后面有一些重要的指令我们将单独讲解. 目录 ls 指令 pwd 指令 cd 指令 touch 指令 mkdir 指令★ rmdir 指令 && rm指令★ man 指令★ cp 指令 ★ mv 指令★ cat && tac指令 e…

nodejs+vue毕业生就业知道信息平台系统

大学毕业生招聘系统分三个身份登录&#xff0c;一个学生&#xff0c;一个管理员&#xff0c;一个是企业用户。学生可以注册登录管理自己的简历,应聘职位,企业用户可以发布招聘&#xff0c;收到应聘信息,查看学生简历,收藏学生简历,而管理员可以修改任何信息。 管理员模块有: 1.…

【8-数据库表结构的创建后台管理系统的搭建】

一.知识回顾 【0.三高商城系统的专题专栏都帮你整理好了&#xff0c;请点击这里&#xff01;】 【1-系统架构演进过程】 【2-微服务系统架构需求】 【3-高性能、高并发、高可用的三高商城系统项目介绍】 【4-Linux云服务器上安装Docker】 【5-Docker安装部署MySQL和Redis服务】…

OPSS-PEG-N3,OPSS-PEG-azide,巯基吡啶-PEG-叠氮化学试剂供应

1、名称 英文&#xff1a;OPSS-PEG-N3&#xff0c;OPSS-PEG-azide 中文&#xff1a;巯基吡啶-聚乙二醇-叠氮 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Azide PEG Orthopyridyl disulfide (OPSS) PEG 4、分子量&#xff1a;可定制&#xff0c;2K 巯基吡啶-PEG-叠…

海量短视频打标问题之多模态机器学习

引言 接着讲&#xff0c;既然我们是给视频打标签&#xff0c;那么肯定就不能只局限于图像上做文章。视频文件包含的信息很多&#xff0c;一个短视频除了有一帧一帧的图像&#xff0c;还有声音信息&#xff0c;甚至还有字幕或者用户打的标签和文字评论之类的这些信息&#xff0…

第2关:ZooKeeper配置

配置项介绍 基础配置 tickTime&#xff1a;Client和Server通信心跳数。 Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔&#xff0c;也就是每隔tickTime的时间就会发送一个心跳。tickTime以毫秒为单位。 initLimit&#xff1a;LF初始通信时限。 集群中的followe…

muduo库的高性能日志库(二)——LogStream文件

目录概述FixBuffer类&#xff08;模板缓冲区&#xff09;LogStream类LogStream.hLogStream.cc十进制整数转化为字符串地址&#xff08;指针&#xff09;数据转换为16进制字符串浮点类型数据转化为字符串Fmt类C单元测试框架&#xff08;简略&#xff09;什么是单元测试常用测试工…

用了CDN就一定比不用更快吗?

对于开发同学来说&#xff0c;CDN这个词&#xff0c;既熟悉又陌生。 平时搞开发的时候很少需要碰这个&#xff0c;但却总能听到别人提起。 我们都听说过它能加速&#xff0c;也大概知道个原因&#xff0c;但是往深了问。 用了CDN就一定比不用更快吗&#xff1f; 就感觉有些…

C++ Reference: Standard C++ Library reference: Containers: deque: deque: cbegin

C官网参考链接&#xff1a;https://cplusplus.com/reference/deque/deque/cbegin/ 公有成员函数 <deque> std::deque::cbegin const_iterator cbegin() const noexcept;返回指向开始的常量迭代器 返回指向容器第一个元素的const_iterator。 const_iterator是指向const内…

大一新生HTML期末作业,实现登录页面

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

js+贝塞尔曲线+animate动画

文章目录一 介绍二 示例1阶贝塞尔曲线2阶贝塞尔曲线3阶贝塞尔曲线:4/n阶贝塞尔曲线三 封装和使用bezier.jsApp.jsxApp.scss一 介绍 贝塞尔曲线(Bzier curve)&#xff0c;又称贝兹曲线或贝济埃曲线&#xff0c;是应用于二维图形应用程序的数学曲线。 下面是我们最常用到bezier曲…

【7-创建商城系统的子模块并将修改后的信息使用Git提交到Gitee上】

一.知识回顾 【0.三高商城系统的专题专栏都帮你整理好了&#xff0c;请点击这里&#xff01;】 【1-系统架构演进过程】 【2-微服务系统架构需求】 【3-高性能、高并发、高可用的三高商城系统项目介绍】 【4-Linux云服务器上安装Docker】 【5-Docker安装部署MySQL和Redis服务】…

测试.net开源敏感词检测库ToolGood.Words

微信公众号“DotNet”看到介绍.net开源敏感词检测库ToolGood.Words的文章《.NET Core一款高性能敏感词检测开源库》&#xff0c;根据参考文献2中的测试&#xff0c;该库的检测效率比C#自带的正则效率高8.8倍&#xff0c;如果数量量越大性能优势越明显。   ToolGood.Words的Gi…

英文Paper写作如何尽量避免抄袭?

说到英文Paper的写作&#xff0c;我们就不得不提到reference&#xff0c;中文称之为引用。在国外&#xff0c;合理正确的利用reference非常重要&#xff0c;国外对于知识产权的保护很严格&#xff0c;对于抄袭行为也是不能容忍的。学术表现差或是学术不诚实问题是造成学生被开除…

4.构造类型,类型转换

构造类型 由若干各个相同或不同类型的数据构成的集合&#xff0c;这种集合类型被称为构造类型 例&#xff1a;int a[10]; 数组、结构体、共用体、枚举 类型转换 数据有不同的类型&#xff0c;不同类型数据之间进行混合运算时必然涉及到类型转换的问题。 转换的方式有两种&am…

使用verdaccio搭建私有组件库

前言 最近公司需要根据现有的公用组件搭建一套私有组件库&#xff0c;方便其他项目使用&#xff0c;然后经过一系列尝试和走了许多坑&#xff0c;终于搭建成功了&#xff0c;这里记录下搭建步骤&#xff0c;希望对你有些帮助。 为什么选择verdaccio 由于公司组件库越来越多&…