匹配子序列的单词数

  • 题目
  • 思路与算法
  • 代码实现
  • 复杂度分析

题目

思路与算法

  1. 本题最简明的思路依然是暴力法,第一时间想到的是对S的所有字符进行组合枚举,但看了一下S的长度是50000以内,所以放弃枚举,选择逐个字母逐个字母查找的方法进行暴力,没有超时,但是时间复杂度显然不乐观,但是作为初始思路还是有必要列举出来,跑题效果如下:
  2. 另一种方法是使用一个指向下一个桶的指针来实现。
    取示例进行说明
    输入:
    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)相关推荐

  1. leetcode 792 匹配子序列的单词数(哈希表+双指针)

    792. 匹配子序列的单词数 中等 282 相关企业 给定字符串 s 和字符串数组 words, 返回  words[i] 中是s的子序列的单词个数 . 字符串的 子序列 是从原始字符串中生成的新字符 ...

  2. 力扣每日一题:792. 匹配子序列的单词数【真没想到是一个二分】

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

  3. LeetCode 792. 匹配子序列的单词数(二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 给定字符串 S 和单词字典 words, 求 words[i] 中是 S 的子序列的单词个数. 示例: 输入: S = "abcde" ...

  4. 青铜三人行之匹配子序列的单词数

    先说一个消息,为了方便互相交流学习,青铜三人行建了个微信群,感兴趣的伙伴可以扫码加下面的小助手抱你入群哦! 每周一题,代码无敌~这次让我们换换口味,讨论一个稍微偏实际一点的问题: 视频 青铜三人行-- ...

  5. LeetCode 0792. 匹配子序列的单词数

    [LetMeFly]792.匹配子序列的单词数 力扣题目链接:https://leetcode.cn/problems/number-of-matching-subsequences/ 给定字符串 s ...

  6. LC792. 匹配子序列的单词数

    LC792. 匹配子序列的单词数题解 题目来源LC792. 匹配子序列的单词数 题干 给定字符串 s 和字符串数组 words, 返回 words[i] 中是s的子序列的单词个数 . 字符串的 子序列 ...

  7. Leetcode 792. 匹配子序列的单词数

    Leetcode 792. 匹配子序列的单词数 给定字符串 s 和字符串数组 words, 返回 words[i] 中是s的子序列的单词个数 . 字符串的 子序列 是从原始字符串中生成的新字符串,可以 ...

  8. Leetcode 792. 匹配子序列的单词数 C++

    Leetcode 792. 匹配子序列的单词数 题目 给定字符串 S 和单词字典 words, 求 words[i] 中是 S 的子序列的单词个数. 示例: 输入: S = "abcde&q ...

  9. LeetCode每日一题——792. 匹配子序列的单词数

    LeetCode每日一题系列 题目:792. 匹配子序列的单词数 难度:普通 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 给定字符串 s 和字符串数组 words, 返回 w ...

最新文章

  1. mysql5.7 cmake源码编译安装
  2. 对于七段数码数字模型进行改进:一个关键的数字1的问题
  3. Silverlight前景One World One Silverlight
  4. apache fop_Apache FOP与Eclipse和OSGi的集成
  5. MATLAB学习笔记(十二)
  6. linux服务器健康检查,Linux 检查硬盘健康状态
  7. html面板插件ui,jQuery布局插件UI Layout简介及使用方法
  8. 双模sa_七句话讲清NSA单模与SA+NSA双模手机的真实区别
  9. SPSS答疑解惑25问【SPSS 071期】
  10. \r,\n,\r\n的问题分析
  11. android 集成x5内核时 本地没有,腾讯X5内核集成一些建议和爬坑记录
  12. python爬取高德地图乡镇区行政区划
  13. 锁存器(74HCT573)使用
  14. java xps生成_Java 将PDF/XPS转为Word/html /SVG/PS/PCL/PNG、PDF和XPS互转(基于Spire.Cloud.SDK for Java)...
  15. 中兴新支点操作系统上如何查找文件
  16. Android aseats 加密,A SEAT
  17. 酷狗小程开发,项目创建(Vue)
  18. Confirming the Buzz about Hornets——2021美赛C题思路及题解
  19. VOLTE-QOS服务质量
  20. Java 高并发第三阶段实战---Java并发包深入解析与使用详解

热门文章

  1. 只十分钟,唾手可得的工作机会就被我搞砸了!
  2. 世界最前沿黑科技实验室 MIT Media Lab 教授 Cynthia: 让社交机器人陪伴千万家庭成为现实...
  3. Visual Basic之父回忆往事
  4. Java 那些最常用的工具类库 | 原力计划
  5. 加密货币的天堂? 盘点 7 大对加密货币免税的国家!
  6. TIOBE 6 月编程语言排行榜:Python 势不可挡,或在四年之内超越 Java、C
  7. “Scrum 敏捷开发都是骗人的!”
  8. @程序员,你的技术为啥十年八年也没有进步?
  9. 离破产仅一步之遥的A站,还能挺过去吗?
  10. 比特币被盗事件频发,这次是 6300 万美元