Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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
Java 查找字符串和字符串前缀之间最长后缀长度的算法_Java_Arrays_String_Algorithm_Suffix - Fatal编程技术网

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的前缀
like
a[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。对吗有了这个假设,就可以知道字符串是否对称了吗?