当前位置: 首页 > 面试题库 >

字符串操作:计算“字符串后缀的相似度”

段晨
2023-03-14
问题内容

对于两个字符串A和B,我们将字符串的相似性定义为两个字符串共有的最长前缀的长度。例如,字符串“ abc”和“ abd”的相似度为2,而字符串“ aaa”和“
aaab”的相似度为3。

问题在于给出一种算法来计算字符串S与每个后缀的相似度之和。例如,将字符串设为:ababaa。然后,该字符串的后缀ababaababaaabaabaaaaa。每个这些字符串与所述串的的相似之处ababaa6,0,3,0,1,1,分别。因此答案是6 + 0 + 3 + 0 + 1 + 1 = 11


问题答案:

您要考虑后缀数组。单词的后缀数组是按字典顺序排序的后缀索引的数组。在链接的维基百科文章中,算法在计算后缀数组时会计算LCP(最长公共前缀)。如本文所示,您可以O(n)使用后缀树的相似性进行计算。

示例:您的字符串为ababaa,因此后缀数组如下所示:

5 | a
4 | aa
2 | abaa
0 | ababaa
3 | baa
1 | babaa

其中左边的数字是后缀开始的索引。现在,由于前缀是按字典顺序存储的,每个人都可以计算前缀。

附带说明,这与最长的公共子字符串问题密切相关。要练习下一次面试,请考虑有效解决问题的方法。



 类似资料:
  • 本文向大家介绍C#计算2个字符串的相似度,包括了C#计算2个字符串的相似度的使用技巧和注意事项,需要的朋友参考一下 计算字符串相似度,直接来C#代码 返回结果就是相似度了,验证码识别上用的到 爱给模板网提供 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 我的问题是这样问的:编写一个比较两个输入字符串的程序。输出每个字符串位置匹配的字符数。输出应根据字符数使用正确的动词(匹配与匹配)。 例如:如果输入是:粉碎崩溃 输出为:4个字符匹配 这就是我到目前为止所拥有的: 导入java.util.Scanner; 我知道这看起来并不多,但我已经尝试了很多其他方法,但我显然缺少一些可以让这更容易做到的东西。我想数一下柜台里类似的字母……但我不知道该怎么办。

  • SETRANGE key offset value 用value 参数覆写(overwrite)给定key 所储存的字符串值,从偏移量offset 开始。 不存在的key 当作空白字符串处理。可以用作append: 注意: 如果偏移量>字符长度, 该字符自动补0x00,注意它不会报错

  • substr key start end 返回截取过的key的字符串值,注意并不修改key的值。下标是从0开始的

  • append key value 返回新字符串值的长度。

  • 前言 忙活了一个礼拜,终于等到周末,可以空下来写点东西。 之前已经完成《数值运算》和《布尔运算》,这次轮到介绍字符串操作 。咱们先得弄明白两个内容: 什么是字符串? 对字符串有哪些操作? 下面是"在线新华字典"的解释: 字符串:简称“串”。有限字符的序列。数据元素为字符的线性表,是一种数据的逻辑结构。在计算机中可有不同的存储结构。在串上可进行求子串、插入字符、删除字符、置换字符等运算。 而字符呢?

  • 字符串操作 函数 char *  rt_strstr (const char *s1, const char *s2)   判断字符串   rt_uint32_t  rt_strcasecmp (const char *a, const char *b)   忽略大小写比较字符串   char *  rt_strncpy (char *dst, const char *src, rt_ubase_

  • 问题 你想在字节字符串上执行普通的文本操作(比如移除,搜索和替换)。 解决方案 字节字符串同样也支持大部分和文本字符串一样的内置操作。比如: >>> data = b'Hello World' >>> data[0:5] b'Hello' >>> data.startswith(b'Hello') True >>> data.split() [b'Hello', b'World'] >>> dat