在给定位置的文本中查找最短的唯一字符串
Find the shortest unique string within a text at a given position
除了通过向 [=12= 处的字符逐渐添加字符的蛮力方法之外,还有哪些其他技术可用于在确定的 position
处找到 text
中唯一的最短字符串] 并检查唯一性?
为了更好地解释,
text = "word1 word2 word3"
If position = 9
(r in word2); shortest_unique_at_pos = "rd2"
.
小观察,if position = 13
(w in word3);结果字符串应该在两个方向上搜索,所以 shortest_unique_at_pos = "2 w"
,而不是 "word3"
。当然,在交替方向上应用一些技术会产生预期的结果。
我假设您试图避免的蛮力方法涉及对每个唯一字符串的 "body of text" 的多次迭代。可以通过 O(n)
的前期成本来解决此问题,其中 n
是文本的长度,然后每次搜索最短的唯一字符串 O(m*k)
其中 m
是"unique string" 和 k
的长度是 "determined index" 处的字母在文本中出现的次数。如果您经常在大文本中搜索简短的唯一字符串,这可能会有所帮助。
您可以预先创建一个字典,其中键是 "body of text" 中的字母,值是带有索引的集合,这些字母可以在文本中找到。例如 python 字典看起来像这样:
indexes = { 'w': {0, 6, 12}, 'o': {1, 7, 13}, 'r': {2, 8, 14} }
创建这样一个字典是一项 O(n)
操作。它可能更复杂,因为内存被(重新)分配并且数据被复制并且你会遇到散列冲突但基本上你浏览一次文本并在相应的索引集中添加一个字母的索引。您对每个 "body of text" 执行一次上述操作,并在每次搜索最短的唯一字符串时重复使用。
当你得到 "determined index" 例如2
从以下位置开始搜索:
- 获取当前索引处的字母
i
。例如'r'
- 复制该字母的索引集以设置
s
例如{2, 8, 14}
- 从
s
中删除 i
例如 {8, 14}
- 增加
s
中的所有索引 (+1) 例如{9, 15}
- 获取
i
之后的下一个字母。例如'd'
- 获取下一个字母的索引集
ns
- 如果
s
和 ns
不相等停止你找到最短的唯一字符串
- 如果
s
和 ns
相等 从第 4 步开始重复
由于步骤 4 - 8 之间的迭代,复杂度与结果字符串的长度成正比。它也与 s
的大小成正比,它等于您开始的字母的频率在文中。比较 2 个集合是否相等的复杂度与最小集合的大小成正比。
在寻找更高效的算法时要注意权衡取舍。对于短文本,蛮力实际上可能更好。上述方法有前期成本,如果您只搜索一次,则可能没有意义。此外,它需要额外的内存。
除了通过向 [=12= 处的字符逐渐添加字符的蛮力方法之外,还有哪些其他技术可用于在确定的 position
处找到 text
中唯一的最短字符串] 并检查唯一性?
为了更好地解释,
text = "word1 word2 word3"
If position = 9
(r in word2); shortest_unique_at_pos = "rd2"
.
小观察,if position = 13
(w in word3);结果字符串应该在两个方向上搜索,所以 shortest_unique_at_pos = "2 w"
,而不是 "word3"
。当然,在交替方向上应用一些技术会产生预期的结果。
我假设您试图避免的蛮力方法涉及对每个唯一字符串的 "body of text" 的多次迭代。可以通过 O(n)
的前期成本来解决此问题,其中 n
是文本的长度,然后每次搜索最短的唯一字符串 O(m*k)
其中 m
是"unique string" 和 k
的长度是 "determined index" 处的字母在文本中出现的次数。如果您经常在大文本中搜索简短的唯一字符串,这可能会有所帮助。
您可以预先创建一个字典,其中键是 "body of text" 中的字母,值是带有索引的集合,这些字母可以在文本中找到。例如 python 字典看起来像这样:
indexes = { 'w': {0, 6, 12}, 'o': {1, 7, 13}, 'r': {2, 8, 14} }
创建这样一个字典是一项 O(n)
操作。它可能更复杂,因为内存被(重新)分配并且数据被复制并且你会遇到散列冲突但基本上你浏览一次文本并在相应的索引集中添加一个字母的索引。您对每个 "body of text" 执行一次上述操作,并在每次搜索最短的唯一字符串时重复使用。
当你得到 "determined index" 例如2
从以下位置开始搜索:
- 获取当前索引处的字母
i
。例如'r'
- 复制该字母的索引集以设置
s
例如{2, 8, 14}
- 从
s
中删除i
例如{8, 14}
- 增加
s
中的所有索引 (+1) 例如{9, 15}
- 获取
i
之后的下一个字母。例如'd'
- 获取下一个字母的索引集
ns
- 如果
s
和ns
不相等停止你找到最短的唯一字符串 - 如果
s
和ns
相等 从第 4 步开始重复
由于步骤 4 - 8 之间的迭代,复杂度与结果字符串的长度成正比。它也与 s
的大小成正比,它等于您开始的字母的频率在文中。比较 2 个集合是否相等的复杂度与最小集合的大小成正比。
在寻找更高效的算法时要注意权衡取舍。对于短文本,蛮力实际上可能更好。上述方法有前期成本,如果您只搜索一次,则可能没有意义。此外,它需要额外的内存。