【问题标题】:Create words based on input like "otb" into "bot"根据输入(如“otb”到“bot”)创建单词
【发布时间】:2021-03-20 15:38:51
【问题描述】:

我想显示给定特定输入可以创建的所有单词的列表。为此,我使用所有包含 12 个字符的单词。

我想到了 SQL 可以查看单词中是否有字母。所以 jecobvizeti 可以变得客观化,但如果我给 jecobvizeti(没有 d)它也可以变得客观化。这也是想要的结果。

有没有办法让 SQL 确定哪些单词匹配,因为它们包含输入字符串的字符。起初,我尝试了 12 个单独的字段,并为 12 个字符的单词在每个字段中存储 1 个字符。但这根本没有意义。

这是不区分大小写的,因为我确保输入是小写的。 它应该只支持字母。没有数字、空格或标点符号。 至于性能,最多10秒就不错了。我认为 SQL 可以做到这一点。

编辑:Ruud Helderman 的解决方案和链接的问题不能 100% 起作用。如果我有以下字母:“beergtoltrot”,它带有一个包含字母“c”的单词或一个包含不在输入字符串中的字母“v”的单词。

【问题讨论】:

  • 区分大小写还是不区分大小写?只有字母还是数字、标点符号、空格?有什么性能要求吗?
  • 不区分大小写,只有字母,最长 10 秒。好问题我会用答案更新主帖
  • 这是关于查找(在表格中,例如英文词典的转储)匹配单词,还是关于生成所有可能性?我假设前者,因为后者会产生十亿个排列。
  • @RuudHelderman 是的,是前者。那个帖子看起来很好,奇怪的是我没有找到它。
  • @RuudHelderman 它就像一个魅力

标签: mysql sql


【解决方案1】:

如果您这样做是为了很多词,而您不是,例如说 'otb' 应该匹配 'brought'。那就是你想要完全相同的一组字母。

那么在几毫秒内得到答案怎么样?

CREATE TABLE x (
    sorted VARCHAR(12) NOT NULL,
    real_word VARCHAR(12) NOT NULL,
    PRIMARY KEY(real_word),
    INDEX(sorted, real_word),
) ENGINE=InnoDB;

sorted 包含real_word 的字母,但按排序顺序重新排列。

`sorted` => `real_word`
'bot' => 'bot'  -- this happens to be in order to start with.
'bcdeeiijotvz' => 'objectivized'
'aest' => 'seat'
'aest' => 'teas'
'aest' => 'eats'
'aest' => 'east'

但是...您必须在两个地方进行这种排序:

  • 在您输入数据时。
  • 在您查找数据时。

最好在您的客户端代码中进行排序。在单表中查找十万字会非常快。

【讨论】:

  • 我的解决方案不能 100% 工作。因为它显示了一些包含不在输入字符串中的字母的单词。但是有了你的解决方案,我想知道它会有多快,因为我有 25k 个单词,其中包含 12 个字母。如果我必须按所有可能的顺序排列它们,我将拥有几百万条记录
  • 您只需按字母顺序排列单词,而不是所有可能的顺序。这是进行此类查找的最快方法
  • @Helper - 每个输入单词只有一行。 sorted 中的字母是按字母顺序排列的,而不是以所有方式重新排列的。查找时,您还必须在执行SELECT 之前按字母顺序排列字母。此时,您可能会得到多行——如座位 -> aest -> seat,teas,etas,east。举个例子说明算法在哪里失败。
  • 我在这里给出的解决方案与之前链接的解决方案不同。
【解决方案2】:

你可以这样做:

where word like '%o%' and
      word like '%b%' and
      word like '%t%'

有一些技巧可以将输入字符串拆分为单个字符。但是,如果您可以在应用程序中执行此操作,则应该可以。

【讨论】:

  • 25K 字和 12 个 LIKE,这会起作用,但速度很慢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 2016-02-12
  • 2021-08-01
  • 2019-11-05
  • 1970-01-01
相关资源
最近更新 更多