最长公共前缀数组

Posted

技术标签:

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

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

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$

【问题讨论】:

【参考方案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

【讨论】:

以上是关于最长公共前缀数组的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-最长公共前缀

最长的公共前缀

每日leetcode-数组-14. 最长公共前缀

LeetCode -- 求字符串数组中的最长公共前缀

Leetcode练习(Python):字符串类:第14题:最长公共前缀:编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。

Leetcode练习(Python):字符串类:第14题:最长公共前缀:编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。