博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
后缀数组的应用
阅读量:5079 次
发布时间:2019-06-12

本文共 1237 字,大约阅读时间需要 4 分钟。

不懂后缀数组的先仔细看这里:

1. 最长公共前缀(LCP,Longest Common Prefix)的后缀数组解法:构建SA[i]数组中相邻元素的最长公共前缀(LCP,Longest Common Prefix),Height[i]表示SA[i]和SA[i-1]的LCP;如果需要求解string中的后缀子串 suffix[i] 和suffix[j]的LCP,则通过Rank数组取得两个后缀的排名m和n ( m < n ),则Height数组在m+1和n之间的最小值就是目标的LCP,这里套个RMQ算法就可以了。

2.最长回文子串(LPS,Longest Palindrome Substring)的后缀数组解法:如求字符串abcddcef的LPS,则将原字符串翻转并在前面加上\(*\) (一般是$)字符,最后连接到源字符串末尾变成abcddcef \(*\) fecddcba,所以LPS转换为求新字符串某两个suffix子串的最长公共前缀。

3.最长公共子串(LCS,Longest Common Substring)的后缀数组解法:最长公共子串指的是字符必须靠在一起的子串,不同于最长公共子序列;一种解法是动态规划(Dynamic Programming),时间复杂度为O(N^2);一种解法是KMP算法,时间复杂度为O(N^2);一种解法是后缀数组解法,时间复杂度为O(NlogN);如求字符串S1:abcdefg和字符串S2:kgdefac的LCS,将S2前面加上\(*\) (一般是$)字符并连接到S1末尾变成abcdefgaa \(*\) kgdefac,则LCS也转换为求新字符串中某两个suffic子串的最长公共前缀,但是这两个子串的起始位置必须在\(*\)前后。

<br>

<br>
<br>

> 1 给定一个字符串,询问某两个后缀的最长公共前缀。

> 2 给定一个字符串,求最长重复子串,这两个子串可以重叠。

> 3 给定一个字符串,求最长重复子串,这两个子串不能重叠。

> 4 给定一个字符串,求至少出现k 次的最长重复子串,这k 个子串可以重叠。

> 5 给定一个字符串,求不相同的子串的个数。

> 6 给定一个字符串,求最长回文子串。

> 7 给定一个字符串L,已知这个字符串是由某个字符串S 重复R次而得到的,求R 的最大值。

> 8 给定一个字符串,求重复次数最多的连续重复子串。

> 9 给定两个字符串 A 和B,求最长公共子串。

> 10 给定两个字符 A 和B,求长度不小于k 的公共子串的个数(可以相同)。

> 11 给定n 个字符串,求出现在不小于k 个字符串中的最长子串。

> 12 给定n 个字符串,求在每个字符串中至少出现两次且不重叠的最长子串。

> 13 给定n 个字符串,求出现或反转后出现在每个字符串中的最长子串。

转载于:https://www.cnblogs.com/LzyRapx/p/7815546.html

你可能感兴趣的文章
从一个标准 url 里取出文件的扩展名
查看>>
map基本用法
查看>>
poj-1163 动态规划
查看>>
Golang之interface(多态,类型断言)
查看>>
Redis快速入门
查看>>
BootStrap---2.表格和按钮
查看>>
Linear Algebra lecture 2 note
查看>>
CRC计算模型
查看>>
Ajax之404,200等查询
查看>>
Aizu - 1378 Secret of Chocolate Poles (DP)
查看>>
csv HTTP简单表服务器
查看>>
OO设计的接口分隔原则
查看>>
数据库连接字符串大全 (转载)
查看>>
java类加载和对象初始化
查看>>
对于负载均衡的理解
查看>>
django简介
查看>>
window.event在IE和Firefox的异同
查看>>
常见的js算法面试题收集,es6实现
查看>>
IO流写出到本地 D盘demoIO.txt 文本中
查看>>
Windows10 下Apache服务器搭建
查看>>