- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我们具有英语词典中所有A-Z词典单词的列表。
我有三种情况要对这些单词列表执行:
1)找出所有以“特定片段”开头的单词
eg: If my fragment is 'car', word 'card' should be returned
eg: If my fragment is 'ace', word 'facebook' should be returned
eg: If my fragment is 'age', word 'image' should be returned
最佳答案
正如我在评论中指出的那样,前缀和后缀大小写由常规子字符串大小写(#2)覆盖。根据定义,所有前缀和后缀也是子字符串。因此,我们需要解决的只是一般的子字符串问题。
由于您有静态字典,因此可以相对容易地将其预处理为一种可以快速查询子字符串的形式。您可以使用后缀树来执行此操作,但是构造和处理简单排序的平面数据向量要容易得多,所以这就是我将在此处描述的内容。
因此,最终目标是要有一个排序的子词列表,以便可以进行二进制搜索来找到匹配项。
首先,请注意,为了找到与查询片段匹配的最长子串,不必列出每个单词的所有可能子串,而只需列出所有可能的后缀。这是因为所有子字符串都只能视为后缀的前缀。 (知道吗?第一次遇到它有点令人费解,但最终很简单,非常有用。)
因此,如果生成每个词典词的所有后缀,然后对它们全部进行排序,则足以在任何词典词中找到任何特定的子字符串:对后缀进行二进制搜索以找到下限(std::lower_bound
) -以查询片段开头的第一个后缀。然后找到上限(std::upper_bound
)-这将是最后一个以查询片段开头的后缀。 [lower,upper []范围内的所有后缀都必须以查询片段开头,因此,这些后缀最初来自的所有单词都包含查询片段。
现在,很明显,实际上拼出所有后缀会占用大量内存-但您不需要。后缀可以仅视为单词的索引-后缀开始的偏移量。因此,每个可能的后缀只需要一对整数:一个用于(原始)单词索引,一个用于该单词中后缀的索引。 (您可以根据字典的大小将两者巧妙地打包在一起,以节省更多空间。)
总而言之,您需要做的是:
生成所有单词的所有单词后缀索引对的数组。
根据它们的语义含义将它们排序为后缀(不是数值)。我建议使用自定义比较器std::stable_sort
。这是最长的步骤,但由于字典是静态的,因此可以脱机一次完成。
对于给定的查询片段,在排序的后缀索引中找到上下限。此范围内的每个后缀都对应一个匹配的子字符串(查询长度,从单词索引的单词后缀索引开始)。请注意,某些单词可能不止一次匹配,甚至可能重叠。
为了澄清,这是由单词“臭鼬”和“奶酪”组成的字典的一个小例子。
“臭鼬”的后缀是“臭鼬”,“ kunk”,“ unk”,“ nk”和“ k”。以索引表示,它们是0, 1, 2, 3, 4
。 “奶酪”的后缀是“奶酪”,“ heese”,“ eese”,“ ese”,“ se”和“ e”。索引为0, 1, 2, 3, 4, 5
。
由于“臭鼬”是我们非常有限的虚构字典中的第一个单词,因此我们将其分配为索引0。“奶酪”位于索引1。因此,最后的后缀为:0:0, 0:1, 0:2, 0:3, 0:4, 1:0, 1:1, 1:2, 1:3, 1:4, 1:5
。
对这些后缀进行排序将产生以下后缀字典(我添加了实际对应的文本子字符串,仅用于说明):
0 | 0:0 | cheese
1 | 0:5 | e
2 | 0:2 | eese
3 | 0:3 | ese
4 | 0:1 | heese
5 | 1:4 | k
6 | 1:1 | kunk
7 | 1:3 | nk
8 | 0:4 | se
9 | 1:0 | skunk
10 | 1:2 | unk
关于c++ - 在单词词典中获取以片段开头/包含/结尾的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29298148/
C 中的字符串或字符数组必须以空字符结尾才能知道它们在哪里结束。为什么相同的规则不适用于其他类型的数组? 例如。计算机如何知道整数数组在哪里结束?整数/浮点数/ double 数组在内存中的表示方式有
我有一堆文件需要查看。这些文件中的所有行都以 ^M (\x0D) 结尾,但最后一行以 ^M^J (\x0D\x0A) 结尾。 显然,Vim 将文件类型确定为 DOS,效果是文件的整个内容是 显示在一行
以下是来自 Why's Poignant Guide to Ruby Chapter 6 的 Ruby 代码片段,他试图在 Ruby 中演示元编程: # Get a metaclass for thi
我有一个编程问题,希望有人能帮我解决。我正在尝试为一项工作任务学习 C 编程,我为自己设定了一个小项目,其中包括读取文件树,其中包括获取有关每个文件的信息的所有子目录。 我遇到的问题是我的程序不会忽略
其他章节请看: react 高效高质量搭建后台系统 系列 尾篇 本篇主要介绍 表单查询 、 表单验证 、 通知 (WebSocket)、 自动构建
我是 FFmepg 的新手,所以如果术语有误,请原谅我。 我想将文本和音频添加到现有的视频文件中。我链接在一起 2 drawText s,然后在不同的过滤器中,我想合并原始源视频的音轨和一些背景音乐。
使用grep我可以使用以下命令搜索单词的开头和结尾 grep -e '\' 这将找到I have a leg.,但找不到play allegro here。 Ripgrep(0.10.0)似乎不支持
$.ajax({ type:'GET', cache: 'false', url:"/foo/", data:{"id": pid}, success:func
我想在我的 iPhone 应用程序中处理旋转手势并在此期间旋转 imageView。在手势结束时,我想将 imageView 旋转到固定位置。所以,即。如果我将 imageView 从 0 弧度旋转到
我知道检测是一种将跟踪代码动态添加到方法中以启用跟踪和调试的技术。 我想知道这是否只是一个“跟踪”选项,硬编码到 CLR 中以仅添加跟踪代码,或者是否能够向方法添加任何代码? 例如,我想检查某个类中每
我正在查看一些专有源代码:使用库的示例程序。 代码是用 C 和 C++ 编写的,使用 make 构建系统。 每个文件都以注释掉的 [] 结尾:/*[]*/ 源文件和 #[]#对于生成文件。这可能是什么
是否可以循环文件中的每一行并检查它是如何结束的(LF/CRLF): using(StreamReader sr = new StreamReader("TestFile.txt")) { st
我从 JSF 网站的编程开始。目前所有文件都以 .xhtml 结尾。当我去http://localhost:8080/myProject/start.jsf一切正常。但是当我将文件从 start.xh
这是一个多站点问题。我有很多网站都带有.htaccess文件,其中包含多行,类似于: rewriterule ^(page-one|page-two|page-three)/?$ /index.php
真的没有简单的映射来跳转到段落的第一行或最后一行吗? { 和 } 是“独占”命令,因此它们会跳转到段落前后的空行如果有的话,但对于段落的实际第一行或最后一行(即,当段落位于缓冲区的顶部或底部时)。 这
我已经尝试了该站点上所有可能的解决方案。我以前使用过改造,过去已经解决了这个问题,但这次我无法解决。我正在使用 StackOverflow API 来获取问题及其详细信息。 API : https:/
我正在做模式匹配如下。但我没有得到正确的输出。请建议正确的代码以获得正确的输出。 代码 #! /usr/bin/perl -w my $subString = "1.3.6.1.2.1.26.2.1.
如何创建 if 语句以检查整数是否以 0 结尾? 例如,我想要一个这样的 if 语句: var test = 107; //107 is an example it'should some unkno
这个问题已经有答案了: javascript how to tell if one number is a multiple of another (6 个回答) 已关闭 3 年前。 每当秒 var
我正在遍历文件树以识别所有 .DYLIB 文件。 #!/bin/bash #script to recursively travel a dir of n levels function traver
我是一名优秀的程序员,十分优秀!