捕获一个字符串,然后匹配以该字符串开头的所有其他单词

2024-01-01

我有一个包含 80,000 多个单词的列表,每个单词都用换行符分隔。我需要匹配每个包含较小单词作为前缀的单词。例如,

bald    <-- captures bald
balder  <-- matches because it starts with bald
balding <-- matches because it starts with bald
care    <-- captures care
cared   <-- matches because it starts with care
cares   <-- matches because it starts with care
caring  <-- does NOT match because it does not start with care

我将在 sublime text 中使用查找和替换,因此我希望能够使用“”替换所有匹配项,从而将它们从我的列表中删除。

好吧,这是背景故事:

我的单词列表基本上是英语词典的缩略版。使用正则表达式,我已经能够删除所有专有名词、缩写、带有重音字符的单词以及所有长度小于 4 个字母的单词。我将使用这本字典来制作我正在制作的 JavaScript 文字游戏。 (是的,这个is对于一个作业,但它是not为了获得学分,作业很简单,就是制作一个简单的 JavaScript 游戏。我的游戏逻辑有效,我可以手动编辑单词列表,但我希望在 2016 年之前完成,所以正则表达式似乎是可行的方法)。

游戏的目的是迫使你的对手拼完一个单词。玩家轮流将字母添加到字符串中,一旦字符串与字典中的单词匹配,游戏就会结束。因此,诸如夸大、过度和过度杀戮之类的词都是沉重的负担。一旦开销的结束被阐明,游戏就......好吧......over.

我将把 wordList 作为数组加载到 JavaScript 文件中,因此我希望它尽可能小。

我确信还有其他方法可以做到这一点(api 等),但我们不能将它们用于此作业。

任何帮助将非常感激!


存储单词列表的有效结构是前缀树 https://en.wikipedia.org/wiki/Trie。例如,给定一个像这样的字典

'car',
'card',
'carder',
'care',
'cared',
'cares',
'caring',
'can'

特里树可能看起来像这样

(where 0表示单词的结尾)。

构建 trie 的代码相当简单:

function buildTree(words) {
    var tree = {};
    words.forEach(function (word) {
        var t = tree;
        [].forEach.call(word + "0", function (char) {
            t = t[char] || (t[char] = {});
        });
    });
    return tree;
}

现在,要枚举以给定前缀开头的所有单词,只需递归遍历 trie 并收集匹配的单词:

function findWords(prefix, tree) {
    var found = [];

    function walk(pfx, t, word) {
        if (!pfx) {
            if (t[0])
                found.push(word)
            for (var c in t)
                walk("", t[c], word + c);
        } else if (pfx[0] in t)
            walk(pfx.substr(1), t[pfx[0]], word + pfx[0]);
    }

    walk(prefix, tree, "");
    return found;
}

完整代码:

function buildTree(words) {
    var tree = {};
    words.forEach(function (word) {
        var t = tree;
        [].forEach.call(word + "0", function (char) {
            t = t[char] || (t[char] = {});
        });
    });
    return tree;
}

function findWords(prefix, tree) {
    var found = [];

    function walk(pfx, t, word) {
        if (!pfx) {
            if (t[0])
                found.push(word)
            for (var c in t)
                walk("", t[c], word + c);
        } else if (pfx[0] in t)
            walk(pfx.substr(1), t[pfx[0]], word + pfx[0]);
    }

    walk(prefix, tree, "");
    return found;
}

words = [
    'car',
    'card',
    'carder',
    'care',
    'cared',
    'cares',
    'caring',
    'can'

]

prefixTree = buildTree(words);
document.write(findWords("care", prefixTree));

要删除以另一个单词开头的单词,您可以按照上面的方式构建 trie,然后遍历它,在终止标记后剪切一次搜索(0)发现:

function buildTree(words) {
    var tree = {};
    words.forEach(function (word) {
        var t = tree;
        [].forEach.call(word + "0", function (char) {
            t = t[char] || (t[char] = {});
        });
    });
    return tree;
}


function findShortWords(tree) {
    var found = [];

    function walk(t, word) {
        if(t[0]) {
            found.push(word);
            return;
          }
        for (var c in t)
            walk(t[c], word + c);
    }

    walk(tree, "");
    return found;
}

words = [
    'card',
    'carder',
    'care',
    'cared',
    'cares',
    'caring',
    'can',
    'canoe',
    'bald',
    'balder',
    'balding',
    'foo'

]

prefixTree = buildTree(words);

document.write(findShortWords(prefixTree));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

捕获一个字符串,然后匹配以该字符串开头的所有其他单词 的相关文章

  • jQuery数据表设置列设计和成功回调中的值

    我为我的数据表编写了以下代码 它用我的数据库中的内容填充表 如下所示 if datatable null datatable destroy datatable tableProducts DataTable pageLength 50 b
  • 如何针对 IE 进行优化?

    我有一个 JS 密集型应用程序 它在 IE 中运行缓慢 我将花费大约一周的时间来优化 IE 并且我想要一些关于尝试的方向 我发现这个线程引用Drip https ieleak svn sourceforge net svnroot iele
  • 通过 Javascript 更改 Webkit 属性?

    请帮助我 可能是因为我对 CSS 动画和 Javascript 相当陌生 但我使用的代码应该更改它的属性 当我运行代码时 它会执行代码中的所有其他操作 除了更改所需 div 的 CSS 属性 我已经尝试了所有这四种方法 但似乎都不起作用 它
  • 从 ES6 模块导入函数表达式或函数声明有什么区别?

    据我了解 参见第 16 3 2 1 节 http exploringjs com es6 ch modules html ES6 允许函数 类导出操作数使用不同的语法 区别在于导出的函数是否需要在导入时解释为函数声明 在这种情况下 您可以编
  • 使用 jquery 更改锚文本和图标

    我有一个隐藏或显示 div 的锚标记 但我无法更改它的文本和图标 如何更改文本和图标标签 因为目前它将图标标签解析为常规文本 锚标记 a class collapse info btn i class icon arrow up icon
  • 在each() 和forEach() 中使用break 和 continue

    如果我们不能使用 break 和 continue 关键字 我不确定我是否理解函数式循环 映射的价值 我可以做这个 collections users models forEach function item index can t use
  • Chrome 跨域 PATCH 请求不起作用

    我有一个带有 REST Api 的网站 现在我正在创建一个浏览器扩展 它将从某些页面收集数据并将它们发送回 REST Api 因为我希望我的扩展能够与 Firefox 和 Chrome 兼容 并且易于维护 所以我将实际代码作为脚本标记注入到
  • dc lineChart 单击时弹出数据点信息

    我正在尝试检测折线图数据点上的点击 Per this answer dc scatter plot binding onClick event https stackoverflow com a 22772340 1873386 I am
  • Webpack - 资产大小限制中的警告:以下资产超出了建议的大小限制 (244 KiB)

    当我在生产模式下运行 webpack 时 有资产规模限制 超出 的警告 我怎样才能运行而不出现这个错误 在我的项目中 我包含 css 并且我看到 webpack 构建中包含一些 node module 目录 但是如果我排除 css 的 no
  • Google 地图 Javascript v3 折线点击事件

    我正在尝试显示一张地图 其中有多条路线布置为折线 单击多段线时 我想显示特定于该线的数据 将数据与线关联不是问题 但无论单击哪条线 显示的数据都会与最近绘制的线关联 就好像每条新折线都会覆盖最后一条线一样 我有一个数据库 其中包含 gpx
  • Jquery 子元素发生变化

    我正在尝试使用 jquery 在子元素 在本例中为 select 更改时触发事件 这是我的 HTML div class row addForm div class col lg 2 col md 2 col sm 3 col xs 6 d
  • Firefox 上的 jquery 焦点未设置

    我想将焦点设置到我的文本区域 以下是我的代码 this textInput val show focus 但它不起作用 实际上 当我按下鼠标按钮时 它会出现 但是当我松开鼠标时 它会从文本区域中删除 因此 经过大量搜索后 我发现 setTi
  • 如何使用转义的 unicode 解码字符串?

    我不确定这叫什么 所以我在搜索时遇到了麻烦 如何使用 unicode 解码字符串http u00253A u00252F u00252Fexample com to http example com使用 JavaScript 我试过unes
  • Jquery Ajax 调用返回 403 状态

    我有一个 jquery Ajax 调用来实现会话的 keepalive 这个 keepAlive 方法将每 20 分钟调用一次 function keepAlive ajax type POST url KeepAliveDummy asp
  • 如何使用 API 中的数据填充选择的下拉元素 - ReactJS

    我对 React 还很陌生 我正在从 API 获取数据 当我检查控制台日志时可以看到数据 但是我不知道如何使用 map 创建一个新数组 然后选项元素可以使用该数组来显示货币代码 目前它填充下拉列表 但选项元素全部为空 结果显示为 NaN 下
  • React Router Tabs——保持组件安装

    我使用 React Router 创建了选项卡 每个选项卡都有不同的路线 但是 我想通过保持隐藏选项卡的安装来维护选项卡转换之间的选项卡状态 我该如何实现这一目标 每次路由切换时 React 路由器都会重新安装每个组件 已经有人问过这个问题
  • javascript从字符串创建不区分大小写的正则表达式

    我试图通过以不区分大小写的方式将输入与正则表达式匹配来进行验证 正则表达式作为对象上的字符串从服务中下来 我可能会得到类似的东西 regex ane 我可以执行以下操作 var rx new RegExp object regex The
  • 正则表达式:如果字符串包含空格则不匹配

    仅当字符串不包含空格时 我似乎无法找出匹配字符串的正则表达式模式 例如 this has whitespace match some pattern 应该返回nil but nowhitespace match some pattern 应
  • 如何使用 Chart.js 版本 3.2.1 在圆环图中添加文本

    我正在使用 Canvas 在 HTML 中使用 如何使用在圆环图中添加文本 这是我的 javascript 代码和 HTML 代码 我使用了图表js版本3 2 1 所以请给出相同版本 3 的解决方案 var overallStatsCanv
  • 用于替换前 5 个数字的正则表达式,无论它们之间有什么?

    我正在努力实现以下匹配 Input 123 45 6789 123456789 1234 正则表达式尝试输出 d 5 123 45 6789 123456789 1234 d 2 3 123 45 6789 123456789 1234 d

随机推荐

  • if 条件从 ruby​​ 数组获取值

    我正在使用以下代码映射一个数组 url http www cnn com page Mechanize new get url images url page images map img img url to s if img width
  • Java 读取文件行并仅提取有用的信息

    我有文件 file1 file2 包含以下内容 2017 02 01 10 00 00 start running error yes doing no finish remind alarmno 123456789 logno 12345
  • 使用最大行长度简洁地序列化 JSON

    因此 我正在生成一个可能很长的 JSON 字符串 以便在 Sendgrid 的 SMTP API 中使用 因为它作为 SMTP 标头 所以它应该具有最大行长度 建议 72 但绝对不超过 1000 文档末尾描述了一种简单的解决方案 http
  • 端点 SWS 没有适配器

    我正在尝试使用创建一个简单的 Hello World WebServicethis http static springsource org spring ws sites 2 0 reference html tutorial html教
  • 在 Android 中格式化 EditText 的电话号码

    我正在制作一个简单的地址簿应用程序 针对 4 2 它需要姓名 地址 城市 州 邮政编码和电话 我想将输入的电话号码格式化为电话号码 XXX XXX XXXX 但我需要将值作为字符串取出 以便在保存时可以将其存储在数据库中 我怎样才能做到这一
  • 从 Internet Explorer 检索所有 cookie

    我正在尝试检索与我打开的特定页面 我已经通过身份验证 关联的所有 cookie 有多个与该网页关联的 cookie 我需要检索每个 cookie 以便稍后进行 POST 我尝试了几种方法 但没有一个给我完整的列表 到目前为止 我已经用 VB
  • 如何在 VS Code 中调试 scala sbt 项目

    我正在尝试在 vs code 中调试 sbt 项目 我已经下载了 VS Code 扩展名 scala Metals 如何在 scala Metal 中显式添加 build sbt 文件夹路径 如何在 scala Metal 中显式添加 bu
  • D3 非连续日期域在 X 轴上产生间隙

    我想绘制一些不连续的时间序列数据 周末 假期等日期的间隙 这是每日数据 数据看起来像这样 date value 1 2 15 109 33 1 5 15 106 25 1 6 15 106 26 1 7 15 107 75 1 8 15 1
  • 忽略Excel求和公式中的隐藏列

    我基本上想忽略Excel中的随机列 有没有办法检测某列是否隐藏 然后不在公式中包含该列 例子是 F1 B1 C1 E1 忽略D列 但第二天 F 栏可能需要 B D E 来代替 有没有办法简单地实现这一目标 我见过一些忽略特定列的公式 但没有
  • 如何检查 Magento 产品是否已添加到购物车?

    我想在 Magento 中首次将产品添加到购物车时显示弹出窗口 并且不想在再次添加或更新产品时显示弹出窗口 简而言之 我想知道将要添加到购物车中的产品是第一次出现还是不是第一次出现 答案很大程度上取决于您想要如何处理父 子类型产品 如果需要
  • 同一应用程序中可以加载不同版本的 DLL 吗?

    我的应用程序使用一个版本的库 a dll 我使用另一个 DLL b dll 它又使用我使用的同一库 a dll 的旧版本 我正在通过嵌入清单文件来构建应用程序 我使用的 DLL 也使用嵌入式清单文件 我的 WinSXS 文件夹中有两个版本的
  • 无法访问 Heroku 上的作曲家供应商文件夹

    我在 Heroku 上托管一个 PHP 应用程序 它使用 Composer 安装 Bootstrap 当我将应用程序部署到 Heroku 时 所有 Composer 依赖项都按预期安装在 vendor 子目录中 我现在尝试将 Bootstr
  • 是否有任何有效的用例可以在现代 C++ 中使用 new 和 delete、原始指针或 c 样式数组?

    这里有一个值得注意的video 停止教学C https www youtube com watch v YnWhqhNdYyk关于 C 语言教学中范式的改变 还有一篇值得注意的博客文章 我有一个梦想 http dev jungle blog
  • 如何打开 Outlook 新邮件窗口 C#

    我正在寻找一种方法在 Outlook 窗口中打开新邮件 我需要以编程方式填充 从 到 主题 正文信息 但保持此新邮件窗口打开 以便用户可以验证内容 添加内容 然后作为正常的 Outlook 消息发送 发现 Process Start Str
  • 排序后 QTableWidget 的填充不完整

    我有一个 QTableWidget 它将填充一些随机值 该表已启用排序 tableWidget setSortingEnabled True 排序工作正常 我知道 在这个最小的例子中 它将是按字母数字排序的数字 但是 当我按一列对表格进行排
  • 致命错误:未捕获反射异常:类配置不存在

    我正在 Laravel 5 8 上开发一个电子商务项目 但由于我不小心在项目文件夹上运行了 laravel new 命令 当我尝试在本地服务器上启动该项目时 我收到此错误 致命错误 未捕获的 ReflectionException C wa
  • GROUP BY 中选择了哪一行?

    假设我有一张桌子 lang title url pt Livro 1 o294jl en Book 1 o294jl en Book 2 o294jl 我运行一个查询 SELECT lang title FROM table GROUP B
  • java.lang.ClassCastException:在 java 1.6 中,java.lang.Long 无法转换为 java.lang.Integer

    就连我也在选角Object到 int 中 但是出现这个异常 实际上我的 Hibernate JPA 方法是 returnObject然后我将其转换为Object into int 这是我的休眠代码 Transactional public
  • 如何在 Vim 中折叠 C++ 风格的注释?

    Vim 中的语法折叠可以轻松地为区域创建折叠 可以使用正则表达式定义折叠的开始和结束 syn 区域 myRegion start region end endregion 透明 keepend 扩展折叠 但是 我不确定如何使用语法折叠来定义
  • 捕获一个字符串,然后匹配以该字符串开头的所有其他单词

    我有一个包含 80 000 多个单词的列表 每个单词都用换行符分隔 我需要匹配每个包含较小单词作为前缀的单词 例如 bald lt captures bald balder lt matches because it starts with