最长公共前缀数组
Posted
技术标签:
【中文标题】最长公共前缀数组【英文标题】: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$
【问题讨论】:
【参考方案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练习(Python):字符串类:第14题:最长公共前缀:编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。
Leetcode练习(Python):字符串类:第14题:最长公共前缀:编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。