【问题标题】:Generate shortest NOT substring for given string为给定字符串生成最短的非子字符串
【发布时间】:2015-11-30 04:49:48
【问题描述】:

我正在处理MIME 消息生成代码,我想为任何给定的输入生成尽可能小的boundaries,即使在流模式下长度未知。

现在我得到了基于随机生成器的足够好的解决方案。基本上我会生成 32 个 Base64 符号的随机字符串,并尝试在其中找到不是 MIME 消息正文的子字符串的最短子字符串。

这不是完美的解决方案,因为:

  1. 边界并不总是最短的。举个非常简单的例子:对于纯 alpha 文本,边界可能只有一位,但生成的边界材料可能只包含 alpha。

  2. 每次运行应用程序时,我都需要随机生成器和唯一的种子。理想情况下,最好有确定性算法。

这就是我想知道的。是否可以保持流式算法的属性,在固定数量的内存上工作,具有确定性并生成理想的最短边界?或者我们只能通过权衡来实现一些属性?

【问题讨论】:

  • 我觉得suffix automaton会对你有所帮助
  • 为什么要关心边界字符串的长度?一个相当长的唯一字符串也更有可能与其他不太注意确保它们具有唯一边界字符串的工具一起正常工作。
  • 谢谢@tripleee,这真的很有趣。
  • 有一个类似的问题here

标签: string algorithm language-agnostic mime boundary


【解决方案1】:

所有边界都以-- 开头,并位于单独的一行。您可以使用它来创建正文中所有可能的“类似边界”的单词的列表,然后创建一个要使用的唯一单词(例如lexicographically)。

此外,假设您有少于 26 个部分,如果您想要“尽可能短”的边界,您可以简单地使用单个字母。在这种情况下,可以使用正则表达式进行扫描:

^--([a-z])$

这(在多行上下文中)将匹配电子邮件正文中的所有单字母“类似上下文”的标记。

假设您将匹配值列表放在哈希集中,那么您可以使用类似的东西生成标记

('a'...'z').where(!tokenHashSet.contains)

以上都是伪代码,希望清楚。

【讨论】:

    猜你喜欢
    • 2021-02-02
    • 2011-02-03
    • 1970-01-01
    • 2015-07-28
    • 2012-10-23
    • 1970-01-01
    • 2018-05-30
    • 2014-05-24
    相关资源
    最近更新 更多