Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 字符串操作:计算;字符串及其后缀的相似性;_String_Algorithm - Fatal编程技术网

String 字符串操作:计算;字符串及其后缀的相似性;

String 字符串操作:计算;字符串及其后缀的相似性;,string,algorithm,String,Algorithm,对于两个字符串A和B,我们将字符串的相似性定义为两个字符串共用的最长前缀的长度。例如,字符串“abc”和“abd”的相似性为2,而字符串“aaa”和“aaab”的相似性为3 问题是给出一个算法来计算字符串S与其每个后缀的相似度之和。例如,字符串为:ababaa。然后,字符串的后缀是ababaa,babaa,abaa,baa,aa和a。这些字符串与字符串ababaa的相似性分别为6,0,3,0,1,1。答案是 6+0+3+0+1+1=11 < /> > 你要考虑。单词的后缀数组是按字典顺序排序的

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

问题是给出一个算法来计算字符串S与其每个后缀的相似度之和。例如,字符串为:
ababaa
。然后,字符串的后缀是
ababaa
babaa
abaa
baa
aa
a
。这些字符串与字符串
ababaa
的相似性分别为
6,0,3,0,1,1
。答案是<代码> 6+0+3+0+1+1=11 < /> >

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

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

5 | a
4 | aa
2 | abaa
0 | ababaa
3 | baa
1 | babaa
其中左边的数字是后缀开始的索引。现在每个人都可以计算前缀,因为所有东西都是按字典顺序存储的

作为旁注,这与问题密切相关。要为下一次面试进行练习,请思考有效解决问题的方法。

首先阅读此链接。 基于python上实现的链接算法的O(n)解决方案:

def z_func(s):
z=[0]*len(s)
l、 r=0,0
对于范围(1,len)中的i:
如果我是:
l、 r=i,z[i]+i-1
返回和(z)+len(s)

那么你有没有尝试解决这个问题?你在哪里卡住了?你在寻求什么样的帮助?Ukkonen算法在O(n)中构建前缀树的实现Ukkonen算法用于构建后缀树,这当然正是本文的目的。后缀树与后缀数组并不完全相同,尽管它们显然是相关的:非常感谢!我确实理解你的意思,但我对后缀树一点也不熟悉,鉴于时间有限,我想问你,你是否可以看看Knuth morris prat algotihm willhelp@PengOne:我尝试构建后缀树,但左侧的编号(即LCP)介于str[I-1]和str[I]之间,他们寻找的是介于“ababaa”和“a”、“ababa”和“aa”、“ababaa”和“abaa”之间的。。我的解决方案失败的地方是因为我在做线性比较,还有什么线索吗?@PengOne你能解释一下如何使用后缀数组解决这个特殊问题吗?或者,与手动将每个后缀与原始字符串进行比较相比,词典排序给解决方案带来了什么好处。@PengOne在创建后缀数组甚至LCP后该怎么做?