`
marshaldong
  • 浏览: 13136 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类

LCS (Longest Common Subsequence) JAVA 实现,与大家分享,希望在实现细节上,如可读性,所占空间与运行时间上面,能有更好建议

阅读更多

import java.util.ArrayList;

/**
* @author marshal dong
*
*/
public class LongestCommonSubString
{

/**
* @param args
*/
public static void main(String[] args)
{
             String str1 = "abcdefg";
             String str2 = "bcdeabcdgfgadefg";
              LongestCommonSubString instance = new LongestCommonSubString(str1, str2);
              instance.printLongestCommonString();
}

private String str1, str2;

public LongestCommonSubString(String str1, String str2)
{
          this.str1 = str1;
            this.str2 = str2;
}

private int[][] matrix = null;

// the list to store their respective index of multiple common sequence
private ArrayList<Integer> longestStringIndexs = new ArrayList<Integer>();

// the length of the longest common sequence
private int longestStringLength = 0;

/**
* Using a matrix to store the common sequence between the two strings, if
* matrix[i][j]=1, it indicates the two strings have the same sequence
* matrix[i][j]; but we are not simply marking 1 for the same part, we also
* calculate the length of the sequence by statement : matrix[i][j] =
* matrix[i - 1][j - 1] + 1; This way, we eliminate the need of finding
* those value that consecutively equals 1 in their diagonal direction
*/
private void constructMatrix()
{
         if (str1 == null || str1.equals("") || str2 == null || str2.equals(""))
               return;

         int len1 = str1.length();
         int len2 = str2.length();
          matrix = new int[len1][len2];

for (int i = 0; i < len1; i++)
{
       for (int j = 0; j < len2; j++)
      {
           if (str1.charAt(i) == str2.charAt(j))
           {
                    if (j == 0 || i == 0)// in this case, we don't need to do
                                                 // addition
                               matrix[i][j] = 1;
                     else
                               matrix[i][j] = matrix[i - 1][j - 1] + 1;

                     if (matrix[i][j] > longestStringLength)
                    {
                            longestStringLength = matrix[i][j];
                            longestStringIndexs.clear();// clear the former index
                            longestStringIndexs.add(i); 
                     }
                     else if (matrix[i][j] == longestStringLength)
                    {
                            longestStringIndexs.add(i); // add the new index if
                                                                        // there are more than one
                                                                        // common stirng
                     }
                } 
            }
       }
}

public void printLongestCommonString()

             constructMatrix();
             printMatrix();

              for (Integer i : longestStringIndexs)
             {
                        System.out.println(str1.substring(i - longestStringLength + 1, i + 1)); 
             }
}

private void printMatrix()
  {
          if (matrix == null)
                 return;
          for (int i = 0; i < matrix.length; i++)
          {
                      for (int j = 0; j < matrix[i].length; j++)
                     {
                                 System.out.print(matrix[i][j] + " ");
                     }
                      System.out.println();
           }
  }

}

运行结果如下 :
0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0
1 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0
0 2 0 0 0 0 3 0 0 0 0 0 0 0 0 0
0 0 3 0 0 0 0 4 0 0 0 0 1 0 0 0
0 0 0 4 0 0 0 0 0 0 0 0 0 2 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0 3 0
0 0 0 0 0 0 0 0 1 0 2 0 0 0 0 4
abcd
bcde
defg

 

分享到:
评论

相关推荐

    LCS 最长公共子序列 JAVA

    最长公共子序列(Longest Common Subsequence,简称LCS)是计算机科学中一种经典的问题,主要出现在序列比对、文本编辑距离等领域。在两个给定的字符串中,LCS是指不考虑字符顺序的最长子串,它同时存在于这两个字符...

    Common_Largest_String

    在这个问题中,我们面对的是算法导论中的一种变体,即最长公共子序列(Longest Common Subsequence, LCS)的变形。LCS问题通常要求找出两个或多个序列中的最长子序列,这个子序列不必是连续的,但必须保持原序列的...

    最长公共子序列及其空间优化

    最长公共子序列(Longest Common Subsequence,LCS)是计算机科学中一个经典的问题,主要应用于文本比较、生物信息学等领域。在这个问题中,我们寻找两个或多个序列中的最长子序列,这个子序列不需要在原序列中连续...

    背包问题,最长子序列问题,矩阵相乘

    接着,我们转向“最长子序列问题”(Longest Common Subsequence, LCS)。LCS问题寻找两个序列的最长子序列,这个子序列不必连续,但必须在两个原始序列中都存在。它在文本比较、生物信息学等领域有广泛应用。LCS...

    最长公共子序列

    最长公共子序列(Longest Common Subsequence,LCS)是计算机科学中一种经典的字符串问题,主要应用于比较两个或多个序列的相似性。在本压缩包中,提供的源码是基于C语言实现的LCS算法,适用于VC6.0编译环境。 首先...

    Java动态规划求解最长公共子序列问题.zip

    最长公共子序列(Longest Common Subsequence,LCS)是计算机科学中一个经典的问题,尤其在算法和数据结构领域有着广泛的应用。这个问题涉及到两个或多个字符串,目标是找到这些字符串中的最长子序列,这个子序列不...

    acm进制转换1

    3. 最大公共子序列(Longest Common Subsequence, LCS)问题:LCS问题是一个经典的动态规划问题,用于找出两个字符串的最长连续子序列,即使它们在原字符串中的位置可能不相同。Lcs_length函数计算两个字符串的最大...

    最长公共子序列c++

    最长公共子序列(Longest Common Subsequence,LCS)是计算机科学中一种经典的字符串问题,主要涉及算法设计和实现,特别是在动态规划领域的应用。在这个问题中,目标是找到两个或多个序列之间的最长子序列,这个子...

    最长公共子序列的C++代码,可以正常运行,有注释。

    在计算机科学中,长公共子序列(Longest Common Subsequence,LCS)是一个经典的算法问题。给定两个序列X和Y,寻找这两个序列的最长公共子序列是指在X和Y中同时出现的最长子序列。例如,如果X是"ABCDGH",Y是"AEDFHR...

    Algorithm-gonp.zip

    - **动态规划**:经典的diff算法通常基于动态规划,如Longest Common Subsequence (LCS)算法,通过构建一个二维矩阵来计算最小编辑距离。 - **优化策略**:为了提高效率,可以使用如Myers算法这样的优化,减少不必...

    C语言毕业设计实验室环境安全检测系统源码.zip

    这个项目名为“BS_LCS-master”,我们可以推断这可能是一个基于C语言的主从结构(Master-Slave)的系统,LCS可能代表Longest Common Subsequence(最长公共子序列),也可能代表Lab Safety Control System(实验室...

    C#实现-动态规划-最长公共子序列-DPLCS

    本主题聚焦于使用C#语言实现动态规划来求解“最长公共子序列”(Longest Common Subsequence,简称LCS)问题。最长公共子序列是指两个或多个字符串中的一个非空子序列,它在原序列中保持原有的相对顺序,但不一定...

    tdiff-开源

    项目不仅关注功能实现,还注重算法优化以提高性能,尤其在实现Longest Common Subsequence (LCS)算法上进行了优化,这是进行文本差异比较的关键技术。 LCS算法是计算两个序列最长公共子序列的算法,常用于找出两个...

Global site tag (gtag.js) - Google Analytics