`
yiminghe
  • 浏览: 1460549 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

LCS与后缀数组

阅读更多

前一段时间的 LCS问题

LCS 问题及其扩展,找到多个字符串的所有公共子串

用后缀树的方法 ,看了编程珠玑后觉得后缀树组更简洁高效 ,故重新实现下


找出单个字符串最长的重复子串以及最长的出现m次的子串。

 

import java.util.ArrayList;
import java.util.Collections;

/**

 * User: yiminghe
 * Date: 2009-3-2
 * Time: 23:36:32

 */
public class LCS {


    //得到单词的后缀树组并按照字母顺序排序
    private static ArrayList<String> getSuffixArray(String s) {
        ArrayList<String> al = new ArrayList<String>();
        int l = s.length();
        for (int i = 0; i < l; i++) {
            al.add(s.substring(i));
        }


        Collections.sort(al);
        return al;
    }


    /**
     * @param s 字符串
     * @return 最长的重复m次字符串
     */
    public static String getLongestCommonSubstring(String s, int m) {
        String longStr = "";
        String[] suffixes = getSuffixArray(s).toArray(new String[0]);
        for (int i = 0; i < suffixes.length - (m - 1); i++) {
            int tl = getCommonLength(suffixes, i, i + m - 1);
            if (tl > longStr.length())
                longStr = suffixes[i].substring(0, tl);
        }
        return longStr;


    }

    //得到n个单词相同的位数
    private static int getCommonLength(String[] s, int start, int end) {
        int c = 0;

        while (true) {
            for (int i = start; i <= end; i++)
                if (s[i].length() <= c) return c;
            for (int i = start; i < end; i++)
                if (s[i].charAt(c) != s[i + 1].charAt(c)) return c;
            ++c;
        }

    }


    public static void main(String[] args) {
        String test = "banana";
        System.out.println(getLongestCommonSubstring(test,3));
    }
}
 

 

 

 

 


分享到:
评论

相关推荐

    后缀数组——罗穗骞附件(源码)

    后缀数组与最长公共前后缀(Longest Common Prefix, LCP)数组相结合,可以形成更强大的工具——后缀数组+LCP结构。LCP数组记录了后缀数组相邻元素之间的最长公共前缀长度,它能进一步提升某些问题的解决效率。 在...

    LCS.zip_LCS 复杂度分析

    构造过程通常包括创建后缀数组、构建后缀树(或后缀数组)然后转换为后缀自动机。查询过程则涉及在自动机上进行状态转移,寻找两个字符串的最长公共前缀,即它们的LCS。 总的来说,这个压缩包中的内容涵盖了字符串...

    LCS.tar.gz_Divide Conquer_LCS_divide and conquer

    在LCS问题中,我们可以将两个字符串S1和S2分别分为前缀和后缀,然后递归地计算前缀和后缀的LCS。具体步骤如下: 1. **基础情况**:如果两个字符串为空,那么它们的LCS长度为0。 2. **分解**:将字符串S1和S2分为两...

    动态规划:最长公共子串 LCS

    - 定义二维数组 \( dp[i][j] \) 表示字符串 \( S \) 的前 \( i \) 个字符和字符串 \( T \) 的前 \( j \) 个字符的最长公共后缀的长度。 - 初始条件:\( dp[0][j] = dp[i][0] = 0 \) 对于所有的 \( i, j \)。 - ...

    回文数据挖掘的算法与应用.pptx

    - 实现思路:首先为序列创建后缀数组,然后通过查询后缀数组来判断其是否构成回文。这种方法的时间复杂度低至O(1)。 - **Manacher算法** - 算法原理:从序列的每个字符向两侧扩展,以该字符为中心找到最长的回文...

    最长递增子序列LCS的实现C源码

    初始化`dp`为1,表示每个单独的元素本身就是递增子序列,然后通过比较所有可能的前缀和后缀组合来更新`dp`数组。 以下是一个简单的C语言实现框架: ```c #include int longestIncreasingSubsequence(int* nums, ...

    字符串问题详解

    后缀树和后缀数组是处理字符串问题时用于模式匹配、查找重复子串等多种复杂问题的强大工具。后缀自动机是一种用于处理字符串问题的自动机,能够有效处理字符串的某些子串问题。 Trie树、KMP算法、AC自动机和后缀树...

    ACM_算法模板集史上最完整收藏版223页pdf

    - 字符串匹配算法(KMP、AC算法、FFT)、后缀数组与后缀树、字典树(Trie)。 - 这些算法对处理大量文本数据、搜索和识别模式等任务非常有用。 6. 数学函数与库: - C语言标准库中的数学函数,如asin、sin、exp、log、...

    最长公共子序列求解问题

    除了基本的动态规划方法,还有一些其他解决LCS问题的方法,如基于后缀树、后缀数组或Z算法的高效算法。这些方法通常在特定场景下具有更好的性能,但理解和实现相对复杂。 在实际应用中,LCS问题不仅仅局限于两个...

    算法知识LC模板.pdf

    5. 字符串处理:KMP算法、扩展KMP、Manacher算法、AC自动机和后缀数组(SA)是处理字符串问题的强大工具。后缀数组可以用于计算最长公共前缀(LCP)、最长可重叠重复子串、最长不可重叠重复子串等。 6. 后缀自动机...

    构造_沈洋.pptx_电子版_pptx版

    解决这类问题可能需要使用到后缀树、后缀自动机或后缀数组等高级数据结构。通过分析字符出现的频率,可以尝试构造一个由出现次数最少的字母组成的字符串,以此来降低LCS的长度。 【图的还原】问题是一个经典的构造...

    DFT的matlab源代码-dreadnought-code-library:dreadnought代码库

    后缀数组(倍增) 后缀自动机 字符串最小表示 Splay Tree LCT 直线下个点个数 JavaIO vimrc Tier 2 Delaunay 三角剖分 后缀树(With Pop Front) Dominator Tree Scherier-Sims DLX 最小树形图(求方案) 最小覆盖球...

    1_金策_字符串算法选讲.pdf

    后缀数组和 LCP 查询 在 O(n log n) 时间空间预处理后(或较复杂的 O(n) 时间空间 预处理), 可以 O(1) 回答: 两个子串的最长公共前缀 (LCP)、最 长公共后缀 (LCS)。 对于拥有周期 p 的串 s, LCP(s[1..n], s[1 + p...

    algorithm:永俊的个人资料库

    算法 Yeongjun的算法解决方案存储库 boj手柄:king7282 codeforce句柄:juyj7282 基本算法 数据结构:堆栈,队列,图,树 DFS,BFS,Dijkstra算法... 后缀数组 FFT(快速傅立叶变换) MCMF(最小成本最大流量) 持久

    参加ACM大赛应该准备哪些课程? (2).pdf

    3. 二分最小表示法、串、KMPTrie结构、后缀树/后缀数组、LCA/RMQ 推荐练习 1. poj3096、poj3007、poj3393、poj1472、poj3371、poj1027、poj2706 2. poj1201、poj2983、poj2516、poj2516、poj2195 3. poj2942、poj...

    pku分类 acm需要的算法 pku必做题目

    5. **字符串处理**:KMP算法、后缀数组、后缀自动机等。 6. **数据结构**:树、堆、队列、栈、链表、哈希表等。 7. **计算几何**:直线交点、凸包、最近点对等。 **PKU必做题目:** PKU提供的必做题目通常是为了...

    求两个字符串的最长公共字串

    ### 最长公共子串问题解析 #### 一、问题背景及定义 在计算机科学领域,尤其是在数据处理与...此外,在实际应用中,还可以考虑使用更高效的算法来进一步提高性能,比如使用后缀数组等高级数据结构来解决此类问题。

    ACM_fuction.rar_dijkstra

    **字符串问题**:比如模式匹配、KMP算法、后缀数组、AC自动机等,对于处理文本数据和搜索问题非常有用。 "ACM小组内部预定函数.doc"可能包含了这些算法的实现代码或详细解释,为参赛者提供了一套完整的工具集,帮助...

    参加ACM大赛应该准备哪些课程?.pdf

    "ACM大赛准备课程资源" ...7. 后缀树 / 后缀数组 8. LCA/RMQ 9. 有限状态自动机理论 10. 排序网络 这只是 ACM 大赛preparedness 的一些基本知识点,需要通过不断的练习和总结来掌握和熟悉这些算法和数据结构。

    学习算法之路

    - **字符串算法**:如KMP算法、后缀数组,处理字符串匹配和分析问题。 #### 状态压缩与回溯 - **状态压缩动态规划**:利用位运算优化状态表示,解决状态空间较大的问题。 - **回溯算法**:适用于解空间探索,如八...

Global site tag (gtag.js) - Google Analytics