【问题标题】:Given a string, what will be the rank of original string in the sorted (lexicographically) sequence of all it's unique substrings给定一个字符串,原始字符串在其所有唯一子字符串的排序(按字典顺序)序列中的排名是多少
【发布时间】:2017-08-27 14:25:19
【问题描述】:

给定一个字符串,原始字符串在其所有唯一子字符串的排序(按字典顺序)序列中的排名。 示例 - abc 子字符串的唯一排序序列是 - a,ab,abc,b,b​​c,c。所以它的排名是3。 有没有比生成所有唯一子字符串并在排序后找到它的排名更好的方法。我在这个问题上使用了 set stl 并得到了 Time Limit Exceeded。

【问题讨论】:

  • 确认一下,“ABABA”的答案是什么?是 5 吗?
  • 是的,它的排名将是 5。

标签: string algorithm


【解决方案1】:

首先,构建给定字符串的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。未经过全面测试,但应该可以正常工作。

【讨论】:

    【解决方案2】:

    为给定的字符串构建suffix array

    为该后缀数组创建longest common prefix 数组

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

    【讨论】:

      猜你喜欢
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多