Indexing 在给定位置查找文本中最短的唯一字符串

Indexing 在给定位置查找文本中最短的唯一字符串,indexing,hash,lookup,text-analysis,Indexing,Hash,Lookup,Text Analysis,除了通过在位置向字符增量添加字符并检查唯一性的暴力外,还有哪些其他技术可以在确定的位置查找文本中唯一的最短字符串 为了更好地解释 text = "word1 word2 word3" 如果位置=9(字2中的r)最短\u唯一\u位于\u pos=“rd2” 如果位置=13(word3中的w),则为小观察值;应在两个方向上搜索结果字符串,以便在\u pos=“2 w”处搜索最短的\u唯一的\u,而不是“word3”。当然,在交替方向的同时应用一些技术将产生预期的结果。我假设您试图避免的暴力方法涉及

除了通过在
位置
向字符增量添加字符并检查唯一性的暴力外,还有哪些其他技术可以在确定的
位置
查找
文本中唯一的最短字符串

为了更好地解释

text = "word1 word2 word3"
如果
位置=9
(字2中的r)<代码>最短\u唯一\u位于\u pos=“rd2”


如果
位置=13
(word3中的w),则为小观察值;应在两个方向上搜索结果字符串,以便在\u pos=“2 w”处搜索
最短的\u唯一的\u,而不是
“word3”
。当然,在交替方向的同时应用一些技术将产生预期的结果。

我假设您试图避免的暴力方法涉及对每个唯一字符串的“文本体”进行多次迭代。可以用
O(n)
的前期成本来解决这个问题,其中
n
是文本的长度,然后每次搜索最短的唯一字符串
O(m*k)
时,其中
m
是“唯一字符串”的长度,
k
是“确定索引”处的字母出现在文本中的次数。如果您经常在大文本中搜索短的唯一字符串,这可能是有益的

您可以提前创建一个字典,其中键是“文本体”中的字母,值是通过索引设置的,这些字母可以在文本中找到。例如,python字典如下所示:

indexes = { 'w': {0, 6, 12}, 'o': {1, 7, 13}, 'r': {2, 8, 14} }
创建这样一个字典是一个
O(n)
操作。它可能更复杂,因为内存被(重新)分配,数据被复制,并且会产生哈希冲突,但基本上,您只需遍历文本一次,然后在相应的索引集中添加字母索引。每个“文本体”执行上述操作一次,并在每次搜索最短的唯一字符串时重复使用

当给您一个“确定的索引”,例如
2
开始搜索时:

  • 获取当前索引
    i
    处的字母。e、 g.
    'r'
  • 复制该字母的索引集以设置
    s
    ,例如
    {2,8,14}
  • s
    中删除
    i
    ,例如
    {8,14}
  • 增加
    s
    中的所有索引(+1),例如
    {9,15}
  • 获取
    i
    之后的下一个字母。e、 g.
    'd'
  • 获取下一个字母的索引集
    ns
  • 如果
    s
    ns
    不相等,则您已找到最短的唯一字符串
  • 如果
    s
    ns
    相等,则重复步骤4
  • 由于步骤4-8之间的迭代,复杂性与结果字符串的长度成正比。它还与
    s
    的大小成正比,该大小等于文本中起始字母的频率。比较两个集合是否相等,其复杂性与最小集合的大小成正比


    在寻找更高效的算法时,请注意权衡。事实上,暴力可能更适合于短文。如果只搜索一次,上述方法的前期成本可能没有意义。此外,它还需要额外的内存。

    给出“唯一字符串”的更正式的定义,该定义非常礼貌地放在@Dmitry中。我会说“什么?”,结果字符串在文本中不会出现多次?@jamima确定的位置会让它混淆,而不是唯一的string@jamima你自己说,这和语言没有多大关系,所以我要去掉那些标签。顺便说一句,这个问题很难解决,现在还不知道。你是对的,暴力解决方案是显而易见的,不需要添加代码。这没用。