20200209:匹配子序列的单词数(leetcode792)
匹配子序列的单词数
- 题目
- 思路与算法
- 代码实现
- 复杂度分析
题目
思路与算法
- 本题最简明的思路依然是暴力法,第一时间想到的是对S的所有字符进行组合枚举,但看了一下S的长度是50000以内,所以放弃枚举,选择逐个字母逐个字母查找的方法进行暴力,没有超时,但是时间复杂度显然不乐观,但是作为初始思路还是有必要列举出来,跑题效果如下:
- 另一种方法是使用一个指向下一个桶的指针来实现。
取示例进行说明
输入:
S = “abcde” ,words = [“a”, “bb”, “acd”, “ace”]
输出:3
首先初始化26个桶,存放26个字母,然后将words存入各桶,a存入0号桶,bb存入1号桶,acd存入0号桶,ace也存入0号桶,根据word的首字母存放,存完之后开始遍历S,第一个字母为a,则开始将old_bucket指向0号桶中的三个word,再清空0号桶,那么cd,ce存入2号桶,依次类推,直到S全部字符遍历完为止。我们只需要在每次替换桶的时候将word加一个计数符号,或者说索引,每次换桶的时候索引增加,遍历完之后如果该索引与当前桶中的word长度相同,则该word为S的子字符串之一,res++即可。跑题性能明显优化了许多,因为只需要遍历一次S,如下:
代码实现
方法一:暴力
package com.immunize.leetcode.numMatchingSubseq;public class Solution {char[] c1, c2;public int numMatchingSubseq(String S, String[] words) { // 计数位int count1 = 0;// S转化为字符数组c1 = S.toCharArray();// 遍历字典数组,判断数组中的每一个字符串是否是c的子字符串for (String word : words) {if (isSubString(word))count1++;}return count1;}// 判断word字符串是否为c1的子字符串.(c1为源字符串的字符数组形式)private boolean isSubString(String word){// 判断方法:只要word中的字符在c1中均出现过即可。int count2 = 0;c2 = word.toCharArray();for (char c : c1) {// 如果刚好全部都出现过,则length会对应上count2if (count2 < c2.length && c2[count2] == c) {count2++;}}return (count2 == c2.length);}}
方法二:指针法
package com.immunize.leetcode.numMatchingSubseq;import java.util.ArrayList;public class Solution2 {class Node {String word;int index;// 含参构造方法,方便下列node的添加public Node(String w, int i) {word = w;index = i;}}public int numMatchingSubseq(String S, String[] words) {int res = 0;// 初始化26个桶ArrayList<Node>[] heads = new ArrayList[26];for (int i = 0; i < 26; ++i)heads[i] = new ArrayList<Node>();// 遍历目标字符串数组中的每一个字符串for (String word : words)// 根据字符串word首字母填入对应的桶,对应索引0,填入的为word字符串heads[word.charAt(0) - 'a'].add(new Node(word, 0));// 将S转化为字符数组,再遍历for (char c : S.toCharArray()) {/* 清空S中出现的字符对应的桶 */// 创建初始桶 ,将已经存放了words数组每一个word的heads指向这个初始桶ArrayList<Node> old_bucket = heads[c - 'a'];// 清空此桶heads[c - 'a'] = new ArrayList<Node>();// 遍历初始桶for (Node node : old_bucket) {node.index++;if (node.index == node.word.length()) {res++;} else {heads[node.word.charAt(node.index) - 'a'].add(node);}}old_bucket.clear();}return res;}}
复杂度分析
时间复杂度:
暴力法:O(S.length * words.length + Σwords[i].length)
指针法:O(S.length + Σwords[i].length)
20200209:匹配子序列的单词数(leetcode792)相关推荐
- leetcode 792 匹配子序列的单词数(哈希表+双指针)
792. 匹配子序列的单词数 中等 282 相关企业 给定字符串 s 和字符串数组 words, 返回 words[i] 中是s的子序列的单词个数 . 字符串的 子序列 是从原始字符串中生成的新字符 ...
- 力扣每日一题:792. 匹配子序列的单词数【真没想到是一个二分】
给定字符串 s 和字符串数组 words, 返回 words[i] 中是s的子序列的单词个数 . 字符串的 子序列 是从原始字符串中生成的新字符串,可以从中删去一些字符(可以是none),而不改变其 ...
- LeetCode 792. 匹配子序列的单词数(二分查找)
文章目录 1. 题目 2. 解题 1. 题目 给定字符串 S 和单词字典 words, 求 words[i] 中是 S 的子序列的单词个数. 示例: 输入: S = "abcde" ...
- 青铜三人行之匹配子序列的单词数
先说一个消息,为了方便互相交流学习,青铜三人行建了个微信群,感兴趣的伙伴可以扫码加下面的小助手抱你入群哦! 每周一题,代码无敌~这次让我们换换口味,讨论一个稍微偏实际一点的问题: 视频 青铜三人行-- ...
- LeetCode 0792. 匹配子序列的单词数
[LetMeFly]792.匹配子序列的单词数 力扣题目链接:https://leetcode.cn/problems/number-of-matching-subsequences/ 给定字符串 s ...
- LC792. 匹配子序列的单词数
LC792. 匹配子序列的单词数题解 题目来源LC792. 匹配子序列的单词数 题干 给定字符串 s 和字符串数组 words, 返回 words[i] 中是s的子序列的单词个数 . 字符串的 子序列 ...
- Leetcode 792. 匹配子序列的单词数
Leetcode 792. 匹配子序列的单词数 给定字符串 s 和字符串数组 words, 返回 words[i] 中是s的子序列的单词个数 . 字符串的 子序列 是从原始字符串中生成的新字符串,可以 ...
- Leetcode 792. 匹配子序列的单词数 C++
Leetcode 792. 匹配子序列的单词数 题目 给定字符串 S 和单词字典 words, 求 words[i] 中是 S 的子序列的单词个数. 示例: 输入: S = "abcde&q ...
- LeetCode每日一题——792. 匹配子序列的单词数
LeetCode每日一题系列 题目:792. 匹配子序列的单词数 难度:普通 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 给定字符串 s 和字符串数组 words, 返回 w ...
最新文章
- mysql5.7 cmake源码编译安装
- 对于七段数码数字模型进行改进:一个关键的数字1的问题
- Silverlight前景One World One Silverlight
- apache fop_Apache FOP与Eclipse和OSGi的集成
- MATLAB学习笔记(十二)
- linux服务器健康检查,Linux 检查硬盘健康状态
- html面板插件ui,jQuery布局插件UI Layout简介及使用方法
- 双模sa_七句话讲清NSA单模与SA+NSA双模手机的真实区别
- SPSS答疑解惑25问【SPSS 071期】
- \r,\n,\r\n的问题分析
- android 集成x5内核时 本地没有,腾讯X5内核集成一些建议和爬坑记录
- python爬取高德地图乡镇区行政区划
- 锁存器(74HCT573)使用
- java xps生成_Java 将PDF/XPS转为Word/html /SVG/PS/PCL/PNG、PDF和XPS互转(基于Spire.Cloud.SDK for Java)...
- 中兴新支点操作系统上如何查找文件
- Android aseats 加密,A SEAT
- 酷狗小程开发,项目创建(Vue)
- Confirming the Buzz about Hornets——2021美赛C题思路及题解
- VOLTE-QOS服务质量
- Java 高并发第三阶段实战---Java并发包深入解析与使用详解
热门文章
- 只十分钟,唾手可得的工作机会就被我搞砸了!
- 世界最前沿黑科技实验室 MIT Media Lab 教授 Cynthia: 让社交机器人陪伴千万家庭成为现实...
- Visual Basic之父回忆往事
- Java 那些最常用的工具类库 | 原力计划
- 加密货币的天堂? 盘点 7 大对加密货币免税的国家!
- TIOBE 6 月编程语言排行榜:Python 势不可挡,或在四年之内超越 Java、C
- “Scrum 敏捷开发都是骗人的!”
- @程序员,你的技术为啥十年八年也没有进步?
- 离破产仅一步之遥的A站,还能挺过去吗?
- 比特币被盗事件频发,这次是 6300 万美元