zoukankan      html  css  js  c++  java
  • 后缀数组的应用

    不懂后缀数组的先仔细看这里:https://www.cnblogs.com/crazyacking/p/3988683.html



    ### 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 个字符串,求出现或反转后出现在每个字符串中的最长子串。

  • 相关阅读:
    Python 安装Twisted 提示python version 2.7 required,which was not found in the registry
    Openfire Strophe开发中文乱码问题
    css div 垂直居中
    How to create custom methods for use in spring security expression language annotations
    How to check “hasRole” in Java Code with Spring Security?
    Android 显示/隐藏 应用图标
    Android 当媒体变更后,通知其他应用重新扫描
    文件上传那些事儿
    专题:点滴Javascript
    主流动画实现方式总结
  • 原文地址:https://www.cnblogs.com/LzyRapx/p/7815546.html
Copyright © 2011-2022 走看看