Java 查找字符串和字符串前缀之间最长后缀长度的算法
输入:Java 查找字符串和字符串前缀之间最长后缀长度的算法,java,arrays,string,algorithm,suffix,Java,Arrays,String,Algorithm,Suffix,输入: S = "ababa" A[]=[0, 1, 2, 3, 4] 有一个长字符串S,我们有一个整数数组a,它表示字符串S的前缀likea[i]表示前缀S[0..a[i]] 输出: S = "ababa" A[]=[0, 1, 2, 3, 4] 返回与A大小相同的数组Output[],其中Output[i]是S[0..A[i]]和S 样本输入: S = "ababa" A[]=[0, 1, 2, 3, 4] 样本输出: S = "ababa" A[]=[0, 1, 2, 3, 4]
S = "ababa"
A[]=[0, 1, 2, 3, 4]
有一个长字符串S
,我们有一个整数数组a
,它表示字符串S的前缀likea[i]
表示前缀S[0..a[i]]
输出:
S = "ababa"
A[]=[0, 1, 2, 3, 4]
返回与A
大小相同的数组Output[]
,其中Output[i]
是S[0..A[i]]
和S
样本输入:
S = "ababa"
A[]=[0, 1, 2, 3, 4]
样本输出:
S = "ababa"
A[]=[0, 1, 2, 3, 4]
输出[]=[1,0,3,0,5]
我拥有的最简单的算法是对每个A[I]
只匹配两个字符串末尾S[0..A[I]]
和S
之间的字符数。但是这个算法是O(n^2)
,其中n是原始字符串S的长度
问题:
是否有更好的算法可以预处理字符串S,然后快速返回整个输入数组的最长长度后缀?您要查找的算法/数据结构称为后缀树它的最坏情况复杂度为O(n log n)
在计算机科学中,后缀树(也称为PAT树或
早期形式,position tree)是一个压缩的trie,包含所有
给定文本的后缀作为其键,在文本中的位置作为
他们的价值观。后缀树允许特别快速地实现
许多重要的字符串操作。()
您可以找到一些详细解释功能和实现的幻灯片这只是颠倒字符串的一部分。稍有不同的是,Z函数的第一个元素被选择为等于S的长度。有一种算法可以计算O(n)中字符串的Z函数
该问题的算法如下:
- S':=S
- Z:=S的Z函数
- 对于每个i,输出[i]:=Z[Len(S)-A[i]-1]
例如:
S = "baabaaa"
A[] = [0,1,2,3,4,5,6]
Output[] should be [0,1,2,0,1,2,7]
S' = "aaabaab"
Z = Z-function(S') = [7,2,1,0,2,1,0] (with the first element chosen to be Len(S))
你能解释一下S[1..A[i]]
应该是什么吗?从1
到A[i]
的子字符串?抱歉更新了问题。它应该是S[0..A[i]]
,它是中从0
到A[i]
的子字符串S@Tim-从位置0
到S
中位置A[i]
的子字符串。好的,后缀需要匹配什么?如果我正确理解问题,前缀应该匹配后缀,也就是说,对于A[1]
而言,前缀应为ab
,并且由于字符串不以ab
结尾,因此输出[1]
为0。对吗有了这个假设,就可以知道字符串是否对称了吗?