图解LeetCode——792. 匹配子序列的单词数(难度:中等)

news2024/12/29 10:44:48

一、题目

给定字符串 s 和字符串数组 words, 返回  words[i] 中是s的子序列的单词个数 。 字符串的 子序列 是从原始字符串中生成的新字符串,可以从中删去一些字符(可以是none),而不改变其余字符的相对顺序。

例如, “ace” 是 “abcde” 的子序列。

二、示例

2.1> 示例 1:

【输入】 s = "abcde", words = ["a","bb","acd","ace"]
【输出】 3
【解释】 有三个是 s 的子序列的单词: "a", "acd", "ace"。

2.2> 示例 2:

【输入】 s = "dsahjpjauf", words = ["ahjpjau","ja","ahbwzgqnuk","tnmlanowax"]
【输出】 2

提示:

  • 1 <= s.length <= 5 * 10^4
  • 1 <= words.length <= 5000
  • 1 <= words[i].length <= 50
  • words[i]和 s 都只由小写字母组成。

三、解题思路

根据题目描述,需要我们去words字符串数组中却判断,哪些是字符串s子序列,最后再将子序列的总个数返回回来。那么,对于字符串子序列,我们主要关心如下两点:

是否存在?】子序列中的某个字符是否在字符串s中存在。
顺序对吗?】子序列中字符出现的顺序是否违背了字符串s中的顺序。

那么针对这两种关注点,我们首先遍历字符串s中的每个字符,由于这些字符都是由小写字母构成,所以我们可以通过采用:字符减去‘a’来确定下标位置,并将该字符在s中出现的位置保存到ArrayList集合中。

然后,我们再分别遍历字符串数组words中的每个字符串,逐一判断每个字符出现的位置顺序是否与s相同,如果不同,则可以判断该字符串不是s的子序列。具体操作详情请见下图:

四、代码实现

class Solution {
    public int numMatchingSubseq(String s, String[] words) {
        List<Integer>[] sm = new ArrayList[26]; // index:字符  sm[index]:字符出现的位置集合
        char[] sc = s.toCharArray();
        for (int i = 0; i < sc.length; i++) {
            if (sm[sc[i]-'a'] == null) sm[sc[i]-'a'] = new ArrayList<>();
            sm[sc[i]-'a'].add(i);
        }

        int result = words.length; // 初始化result数量为所有单词,如果不满足条件,则陆续执行减1操作
        for (String word : words) { // 遍历每个单词
            int compareIndex = -1, index;
            for (int i = 0; i < word.length(); i++) { // 遍历每个字符
                if (sm[word.charAt(i)-'a'] == null || 
                        ((index = findCharIndex(compareIndex, sm[word.charAt(i)-'a'])) <= compareIndex)) {
                    result--;
                    break;
                }
                compareIndex = index;
            }
        }
        return result;
    }

    // 折半查找
    private int findCharIndex(int compareIndex, List<Integer> list) {
        int head = 0, tail = list.size() - 1, mid;
        while (head < tail) {
            mid = head + (tail - head) / 2;
            if (list.get(mid) > compareIndex) tail = mid;
            else head = ++mid;
        }
        return list.get(head);
    }
}

 今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

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

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

相关文章

css3对页面打印设置的一些特殊属性,如@page,target-counter等

公司内部应业务需求&#xff0c;需要将html生成pdf并能打印&#xff0c;前后台都各有方式&#xff0c;这里综合比较选择用java去生成&#xff0c;避免了前端生成带来的诸多问题&#xff0c;后台用的框架是 iTextPdf 但是在做的同时发现用iText实现的pdf生成和公司的业务需要生成…

Spring学习第6篇: 基于注解使用IOC

大家家好&#xff0c;我是一名网络怪咖&#xff0c;北漂五年。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深Java选手&#xff0c;深知Spring重要性&#xff0c;现在普遍都使用SpringBoot来开发&#xff0c;面试的时候SpringBoot原理也是经常会问到&…

【数据链路层】封装成帧和透明传输和差错控制

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录前言链路层功能功能封装成帧和透明传输组帧的四种方法透明传输差错控制检错编码差错链路层的差错控制检错编码纠错编码链路层代码实现&#x1f343;博主昵称&#xff1a;一拳必胜客 &#x1f338;博主寄语&a…

27.gateway的限流实战(springcloud)

1 什么是限流 通俗的说&#xff0c;限流就是限制一段时间内&#xff0c;用户访问资源的次数&#xff0c;减轻服务器压力&#xff0c;限流大致分为两种&#xff1a; 1. IP 限流&#xff08;5s 内同一个 ip 访问超过 3 次&#xff0c;则限制不让访问&#xff0c;过一段时间才可继…

E-Prime心理学实验设计软件丨产品简介

拖放设计 通过将对象拖放到时间轴上来构建文本、图像、声音和视频的实验。利用我们的实验库中的免费模板和预建实验。 计时精度 E-Prime 3.0 将计时精度报告到毫秒精度级别。请务必使用我们的测试工具来确认您的计算机硬件能够进行关键计时。将Chronos添加到您的研究设置中&a…

Kubernetes 系统化学习之 资源清单篇(三)

Kubernetes 是一个可移植的、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;可促进声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统。 根据不同的级别&#xff0c;可以将 Kubernetes 中的资源进行多种分类。以下列举的内容都是 K…

轻松学习jQuery控制DOM

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;前端开发者…

ESP8266--Arduino开发(驱动WS2812B)

文章目录一、WS2812彩灯介绍二、安装Adafruit_NeoPixel驱动库三、Adafruit_NeoPixel库常用接口四、使用示例五、网页端控制WS2812B灯带实例一、WS2812彩灯介绍 WS2812是一个集控制电路与发光电路于一体的智能外控LED光源&#xff0c;外型与5050LED灯珠相同&#xff0c;每个灯珠…

Linux修改默认登录端口22

目录 一、编辑sshd配置 二、重启sshd 三、防火墙开放端口 四、重启防火墙 五、测试连接 六、防火墙关闭22端口 前言&#xff1a;ssh登录的默认端口是22&#xff0c;如果不修改默认端口的话&#xff0c;会不安全&#xff0c;默认端口会遭到攻击&#xff0c;为了安全要修…

JavaEE之HTTP协议 Ⅰ

文章目录前言一、协议格式总结二、认识URL三、认识"方法"(method)1.GETGET请求的特点2.POSTPOST 请求的特点总结前言 网络技术中,最核心的概念,就是"协议",HTTP就是应用层典型的协议 应用层,很多时候需要程序员自定义应用层协议,也有一些现成的协议,供我们…

代码随想录算法训练营第57天 | 647. 回文子串 516.最长回文子序列 dp总结

代码随想录系列文章目录 动态规划篇 —— 区间dp 文章目录代码随想录系列文章目录动态规划篇 —— 区间dp647. 回文子串516.最长回文子序列代码随想录中动态规划总结647. 回文子串 题目链接 回文子串还是很难的我觉得&#xff0c;所以应该多做几遍 这道题的dp数组代表就不是问…

Linux之用户操作【用户的增删改查你要的都有】【详细】

目录用户相关介绍添加用户useradd [选项] 用户名passwd 用户名细节说明删除用户userdel 用户名userdel -r 用户名查询用户id 用户名切换用户su 用户名默认输入su切换到管理员目录用户组groupadd 组名userdel 组名补充&#xff1a; useradd -g 用户组 用户名补充&#xff1a;use…

BigLEN(rat)脑内最丰富的多肽之一、LENSSPQAPARRLLPP

BigLEN(rat) TFA 是脑内最丰富的多肽之一&#xff0c;是有效的 GPR171 激动剂&#xff0c;其EC50 值为1.6 nM。 BigLEN(rat) TFA, one of the most abundant peptides in brain, is a potent GPR171 agonist, with an EC50 of 1.6 nM[1][2].编号: 200557 中文名称: BigLEN(rat)…

详解MySQL事务日志——undo log

前言 众所周知&#xff0c;事务的一大特点是原子性&#xff0c;即同一事务的SQL要同时成功或者失败。那大家有没有想过在MySQL的innoDB存储引擎中是如何保证这样的原子性操作的&#xff1f;实际上它是利用事务执行过程中生成的日志undo log来实现的&#xff0c;那么undo log究…

加速推进企业信息化建设,SRM采购系统赋能建筑工程产业生态链实现数字化转型

建筑工程行业是拉动国民经济发展的重要支柱产业之一。近年来建筑业占国民生产总值的20&#xff05;左右&#xff0c;对国民经济影响很大。随着我国建筑业企业生产和经营规模的不断扩大&#xff0c;建筑业总产值持续增长&#xff0c;传统的管理手段早已无法实现企业的精细化管理…

Fiddler/Charles - 夜神模拟器证书安装App抓包

Fiddler/Charles - 夜神模拟器证书安装App抓包 文章目录Fiddler/Charles - 夜神模拟器证书安装App抓包前言一、软件安装1.Openssl安装1.1下载安装1.2配置环境变量1.3查看openssl版本&#xff0c;输入命令&#xff1a;openssl version2.夜神模拟器安装1.1 下载安装1.2工具准备&a…

三、RTMP协议 视频Chunk和音频Chunk到底长啥样?

重要概念 RTMP Chunk Header RTMP Chunk Header的长度不是固定的&#xff0c;分为: 12 Bytes、8 Bytes、4 Bytes、1 Byte 四种&#xff0c;由RTMP Chunk Header前2位决定。 FLV VideoTagHeader 分析RTMP流时&#xff0c;经常看到与0x17或0x27进行比较的情况&#xff0c;那0x1…

Azide-PEG-acid,N3-PEG-COOH,叠氮-聚乙二醇-羧基多用于点击化学

Azide-PEG-acid&#xff08;N3-PEG-COOH&#xff09;&#xff0c;该化学试剂的中文名为叠氮-聚乙二醇-羧基&#xff0c;它所属分类为Azide PEG Carboxylic acid PEG。 该peg试剂的分子量均可定制&#xff0c;有&#xff1a;1000、2000、3400、20000、10000、5000 。该试剂质量…

k8s部署

kubernetes简要 Kubernetes 是用于自动部署, 扩展和管理容器化应用程序的开源系统. 它将组成应用程序的容器组合成逻辑单元, 以便于管理和服务发现 kubernetes 功能简介 服务发现和负载均衡 存储编排 自动部署和回滚 自动完成装箱计算 自我修复 密钥与配置管理 主机规…

UE5蓝图常用流程节点总结

整理了一下平常做功能开发比较常用的蓝图节点&#xff0c;目录如下&#xff1a; 1. ExecuteConsoleCommand 2. Do N 3. Do Once 4. DoOnceMultiInput 5. Gate 6.MultiGate 7. Branch 8. Sequence 9. FlipFlop 10. Delay 11. Retriggerable Delay 1. ExecuteConsole…