给定一个字符串,在所有它的唯一子串

时间:2017-08-27 14:25:20

标签: string algorithm

给定一个字符串,在所有它的唯一子字符串的排序(按字典顺序)序列中将是原始字符串的等级。 例子 - abc 唯一排序的子串序列是 - a,ab,abc,b,bc,c。所以它的排名是3。 有没有比生成所有唯一子串更好的方法,并在排序后找到它的排名。我使用set stl来解决这个问题,并且超出了时间限制。

2 个答案:

答案 0 :(得分:0)

为给定字符串构建suffix array

为该后缀数组生成longest common prefix数组

在后缀数组

中的原始字符串位置之前计算唯一子串

答案 1 :(得分:0)

首先,构建给定字符串的suffix array

例如,如果字符串为“ABABA”,则其后缀数组sa[]和高度数组height[i]=LCP(sa[i],sa[i-1])将为:

| i    | sa[i] | height[i] |
| ---- | ----- | --------- |
| 1    | A     | 0         |
| 2    | ABA   | 1         |
| 3    | ABABA | 3         |
| 4    | BABA  | 0         |
| 5    | BA    | 2         |

您可以看到ABABA之前的每个子字符串都属于后缀数组中ABABA之前的后缀。例如:

  • A,属于sa[1]
  • AABABA属于sa[2]。但是重复了第一个子串。
  • AABABAABABABABA属于sa[3]。但是重复了前3个子串。

因此,如果整个字符串在后缀数组中排名为#n,那么答案将为:

\sum_{i=1}^{n} length(sa[i]) - height[i]

所以“ABABA”的答案是1+3+5-1-3=5

您可以获得此问题的完整源代码here。没有经过全面测试,但它应该有效。