String 字符串操作:计算;字符串及其后缀的相似性;
对于两个字符串A和B,我们将字符串的相似性定义为两个字符串共用的最长前缀的长度。例如,字符串“abc”和“abd”的相似性为2,而字符串“aaa”和“aaab”的相似性为3 问题是给出一个算法来计算字符串S与其每个后缀的相似度之和。例如,字符串为: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 < /> > 你要考虑。单词的后缀数组是按字典顺序排序的
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后该怎么做?