【问题标题】:Longest Common Prefix Array最长公共前缀数组
【发布时间】:2012-02-01 05:37:12
【问题描述】:

以下是字符串MISSISSIPPI 的Suffix array 和LCP array 信息。我知道LCP 提供了有关str[i - 1] 和str[i] 之间最长公共前缀长度的信息。如何获得此字符串的任意两个任意后缀之间的最长公共前缀长度。例如,我想要MISSISSIPPI 和ISSIPPI 之间的最长公共前缀

SA  LCP
12  0     $
11  0     I$
8   1     IPPI$
5   1     ISSIPPI$
2   4     ISSISSIPPI$
1   0     MISSISSIPPI$
10  0     PI$
9   1     PPI$
7   0     SIPPI$
4   2     SISSIPPI$
6   1     SSIPPI$
3   3     SSISSIPPI$

【问题讨论】:

    标签: algorithm data-structures string-matching


    【解决方案1】:

    在http://en.wikipedia.org/wiki/Suffix_array 中,我们了解到“属于一组连续排序后缀的最小 lcp 值给出了所有这些后缀中最长的公共前缀这一事实也很有用。”因此,在您的情况下,MISSISSIPPI 和 ISSIPPI 之间的 LCP 为 min(4, 0) = 0。

    您可以通过http://en.wikipedia.org/wiki/Range_Minimum_Query 在 O(1) 时间内找到时间范围内的最小值,如果您查看那里的 TopCoder 链接,还有很多关于替代方法的信息。

    【讨论】:

    • 谢谢,以下对 (IPPI,MISSISSIPPI) 或 (ISSIPPI, MISSISSIPPI) 的逻辑应该是什么
    • 对于这两个对 - 以及任何包含
    【解决方案2】:

    最长公共前缀问题的Javascript解决方案

    const longestPrefix = arr => {
      if (arr.length === 0) {
        return "";
      }
      if (arr.length === 1) {
        return arr[0];
      }
      let end = 0;
      let check = false
      for (let j = 0; j < arr[0].length; j++){
        for (let i = 1; i < arr.length; i++) {
          if (arr[0][j] !== arr[i][j]) {
            check = true;
            break;
          }
        }
        if (check) {
          break;
        }
        end++;
      }
      return (arr[0].slice(0, end))
    }
    

    测试输入

    console.log(longestPrefix(["Jabine", "Jabinder", "Jabbong"]))
    

    输出

    Jab
    

    【讨论】:

      猜你喜欢
      • 2014-10-13
      • 2021-09-11
      • 1970-01-01
      • 2022-11-22
      • 2018-09-30
      • 2013-04-14
      • 2020-07-05
      • 2020-02-10
      • 2022-01-11
      相关资源
      最近更新 更多