当前位置: 首页 > 知识库问答 >
问题:

找到2个字符串的最长公共子序列?

仲孙翔飞
2023-03-14

我正在学习最长公共子序列,使用以下算法:

公共级LCS{

static int[][] E;
static int[][] S;
static int D;
static int T;
static int L;
public static void LCS_cost(String X,String Y)
{       
    int m = X.length();
    int n = Y.length();
    E = new int[m][n];
    S = new int[m][n];
    for(int i=0;i<m;i++){
        E[i][0] = 0;
    }
    for(int j=0;j<n;j++){
        E[0][j] = 0;
    }
    for(int i=1;i<m+1;i++){
        for(int j=1;j<n+1;j++){
            if(X.charAt(i) == Y.charAt(j)){
                E[i][j] = E[i-1][j-1]+1;
                D =  E[i-1][j-1]+1;
                S[i][j] = D;//Diagonal Direction    
            }
            else if (E[i-1][j]>=E[i][j-1]){
                    E[i][j] = E[i-1][j];
                    T = E[i-1][j];
                    S[i][j] = T;//TOP
            }
            else
                    E[i][j] = E[i][j-1];
                    L = E[i][j-1];
                    S[i][j] = L;//Left
        }
    }

}

public static void Backtrack(int[][] S,String X,String Y){
int row = X.length();
int col = Y.length();   

while (row > 0 || col > 0){
    if (S[row][col] == D){
        System.out.print(X.charAt(row));
        row--;
        col--;
    }
    else if (S[row][col] == T){
        row--;
    }
    else
        col--;
}
}
public static void main(String[] args) {
    new  LCS();
    LCS_cost("SCHOOL","SPOOL");
    Backtrack(S,"SCHOOL", "SPOOL");
    }
}

但是程序返回一个ErrorCharAt(未知来源),并且没有做任何事情。

for(int i=1;i<m+1;i++){
        for(int j=1;j<n+1;j++){
for(int i=1;i<m;i++){
        for(int j=1;j<n;j++){
if (S[row][col] == D){
    ....
    }

另外,如果我将int i和j更改为0,那么下面的E将是索引-1和错误

for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            if(X.charAt(i) == Y.charAt(j)){
                E[i][j] = E[i-1][i-1]+1;
                ......
            }

我现在很迷路。有人能帮我吗?

共有1个答案

夏何平
2023-03-14

我会使用字符串而不是处理单个字符:

String findLCS(String str1, String str2) {
    int longest = 0;
    String longestSubstring = "";

    for (int i=0; i < str1.length(); ++i) {
        for (int j=i+1; j <= str1.length(); ++j) {
            String substring = str1.substring(i, j);
            if (str2.contains(substring) && substring.length() > longest) {
                longest = substring.length();
                longestSubstring = substring;
            }
        }
    }

    return longestSubstring;
}

正如您所看到的,使用string.contains()比看起来更强大。

 类似资料:
  • 然而,我意识到我真正想解决的问题有点不同。给定一个固定的k,我需要确保公共子序列只涉及长度正好为k的子串。例如,设置k=2,并让这两个字符串为 我需要的子序列是“。 是否可以修改动态规划解来解决这个问题?

  • 本文向大家介绍手写代码:两个字符串的最长公共子序列?相关面试题,主要包含被问及手写代码:两个字符串的最长公共子序列?时的应答技巧和注意事项,需要的朋友参考一下 参考回答:  

  • 一个序列中去掉若干(也可以不去掉)元素剩下的部分称为其子序列。对于给定的序列X = <x1,x2,…,xm>,称序列Z = <z1,z2,…,zk>为X的一个子序列,仅当在X中存在一个递增序号序列<i1,i2,…,ik>,对所有的j(1,2,…,k)满足 xij​= z j。例如,Z = <a,b,f,c>是X = <a,b,c,f,b,c> 的一个子序列,X中相应的序号序列为 <1,2,4,6>

  • 问题内容: 我正在寻找一个Python库,用于从 一组字符串中 找到最长的公共子 字符串 。有两种方法可以解决此问题: 使用后缀树 使用动态编程。 实施的方法并不重要。重要的是,它可以用于 一组字符串 (不仅是两个字符串)。 问题答案: 这些成对的函数将在任意字符串数组中找到最长的公共字符串: 毫无疑问,该算法可以得到改进,而且我对Python的接触也很少,因此也许它在语法上也可能更有效,但是它应

  • 问题内容: 提出一个最优雅的JavaScript,Ruby或其他解决方案来解决一个相对琐碎的问题是一个挑战。 这个问题是Longest common substring问题的 一个更具体的情况。我只需要找到数组中最长的公共 起始 子串。这大大简化了问题。 例如,最长的子字符串是“ inters”。但是,我不需要在中找到“有意义” 。 我已经通过用JavaScript快速编写一个解决方案来解决该问题

  • 本文向大家介绍Python求两个字符串最长公共子序列代码实例,包括了Python求两个字符串最长公共子序列代码实例的使用技巧和注意事项,需要的朋友参考一下 一、问题描述 给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence)。比如字符串1:BDCABA;字符串2:ABCBDAB。则这两个字符串的最长公共子序列长度为4,最长公共子序列是:BCBA 二、算法