[Swift]LeetCode792. 匹配子序列的单词数 | Number of Matching Subsequences

Given string S and a dictionary of words words, find the number of words[i] that is a subsequence of S.

Example :
Input:
S = "abcde"
words = ["a", "bb", "acd", "ace"]
Output: 3
Explanation: There are three words in words that are a subsequence of S: "a", "acd", "ace".

Note:

  • All words in words and S will only consists of lowercase letters.
  • The length of S will be in the range of [1, 50000].
  • The length of words will be in the range of [1, 5000].
  • The length of words[i] will be in the range of [1, 50].


给定字符串 S 和单词字典 words, 求 words[i] 中是 S 的子序列的单词个数。

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

注意:

  • 所有在words和 S 里的单词都只由小写字母组成。
  • S 的长度在 [1, 50000]
  • words 的长度在 [1, 5000]
  • words[i]的长度在[1, 50]


Runtime: 740 ms

Memory Usage: 20 MB

 1 class Solution {
 2     func numMatchingSubseq(_ S: String, _ words: [String]) -> Int {
 3         let arrS:[Character] = Array(S)
 4         var res:Int = 0
 5         var n:Int = S.count
 6         var pass:Set<String> = Set<String>()
 7         var out:Set<String> = Set<String>()
 8         for word in words
 9         {
10             let arrW:[Character] = Array(word)
11             if pass.contains(word) || out.contains(word)
12             {
13                 if pass.contains(word) {res += 1}
14                 continue
15             }
16             var i:Int = 0
17             var j:Int = 0
18             var m:Int = word.count
19             while (i < n && j < m)
20             {
21                 if arrW[j] == arrS[i] {j += 1}
22                 i += 1
23             }
24             if j == m
25             {
26                 res += 1
27                 pass.insert(word)
28             }
29             else
30             {
31                 out.insert(word)
32             }
33         }
34         return res
35     }
36 }


1168ms

 1 class Solution {
 2     func numMatchingSubseq(_ S: String, _ words: [String]) -> Int {
 3         var indices = [Character: [Int]]()
 4         let S = Array(S.characters)
 5         for i in 0..<S.count {
 6             indices[S[i], default:[]].append(i)
 7         }
 8
 9         func binarySearch(_ ch: Character, _ from: Int) -> Int {
10             guard let arr = indices[ch] else { return -2 }
11             if from > arr.last! { return -2 }
12
13             var l = 0, r = arr.count - 1
14             while l < r {
15                 let mid = (l + r) / 2
16                 if arr[mid] < from {
17                     l = mid + 1
18                 } else {
19                     r = mid
20                 }
21             }
22             return arr[r]
23         }
24
25         var res = 0
26         for w in words {
27             var from = 0
28             for ch in w.characters {
29                 from = binarySearch(ch, from) + 1
30                 if from < 0 { break }
31             }
32             if from >= 0 { res += 1 }
33         }
34         return res
35     }
36 }

原文地址:https://www.cnblogs.com/strengthen/p/10547036.html

时间: 2024-10-09 03:15:33

[Swift]LeetCode792. 匹配子序列的单词数 | Number of Matching Subsequences的相关文章

LeetCode 792. 匹配子序列的单词数(Number of Matching Subsequences)

792. 匹配子序列的单词数 792. Number of Matching Subsequences 相似题目 392. 判断子序列 原文地址:https://www.cnblogs.com/hglibin/p/10829098.html

[Elasticsearch] 邻近匹配 (一) - 短语匹配以及slop參数

本文翻译自Elasticsearch官方指南的Proximity Matching一章. 邻近匹配(Proximity Matching) 使用了TF/IDF的标准全文搜索将文档,或者至少文档中的每一个字段,视作"一大袋的单词"(Big bag of Words).match查询可以告诉我们这个袋子中是否包括了我们的搜索词条,可是这仅仅是一个方面.它不能告诉我们关于单词间关系的不论什么信息. 考虑下面这些句子的差别: Sue ate the alligator. The alligat

Linux - wc统计文件行数、单词数或字节数

一 wc简介 wc命令用来打印文件的文本行数.单词数.字节数等(print the number of newlines, words, and bytes in files).在Windows的Word中有个"字数统计"的工具,可以帮我们把选中范围的字数.字符数统计出来.Linux下的wc命令可以实现这个 功能.使用vi打开文件的时候,底下的信息也会显示行数和字节数. 二 常用参数 格式:wc -l <file> 打印指定文件的文本行数.(l=小写L) 以下参数可组合使用

洛谷 P1308 统计单词数【字符串+模拟】

P1308 统计单词数 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置.注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章 中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 ). 输入输出格式 输入格式: 输入文件

JSK-27321 统计单词数【字符串】

统计单词数 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置. 注意:匹配单词时,不区分大小写,但要求完全匹配, 即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例 1), 如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例 2). 输入格式 第 1 行为一个字符串,其中只含字母,表示

HDU2072 单词数 【STL】+【strtok】

单词数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 28045    Accepted Submission(s): 6644 Problem Description lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数.下面你的任务是帮助xiaoou333解决这个问题. Inp

作业-- 统计文本文件中的字符数、单词数、行数

用AndroidStudio解析统计文本文件中的字符数.单词数.行数. 代码部分: package administrator.mc; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widge

C语言 &#183; 单词数统计

单词数统计 输入一个字符串,求它包含多少个单词. 单词间以一个或者多个空格分开. 第一个单词前,最后一个单词后也可能有0到多个空格. 比如:" abc    xyz" 包含两个单词,"ab   c   xyz    "  包含3个单词. 1 #include<stdio.h> 2 #include<string.h> 3 int get_word_num(char* buf){ 4 int n = 0; 5 int tag = 1; 6 ch

Android 简单统计文本文件字符数、单词数、行数Demo

做的demo是统计文本文件的字符数.单词数.行数的,首先呢,我们必须要有一个文本文件.所以我们要么创建一个文本文件,并保存,然后再解析:要么就提前把文本文件先放到模拟器上,然后检索到文本名再进行解析.我感觉第二种方法不可行,因为要测试时,肯定要多次测试,每次还要找到文件再修改文件内容,过于麻烦.所以我用的第一种方法,文件内容更改后直接保存即可. 首先是 页面布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res