LongestCommonSequence 最长连续公共子序列(算法导论是最长公共子序列)
2014-08-29 21:42
633 查看
import java.util.Scanner; //最长连续公共子序列 //连续i子串的特点就是如果str1[i]和str2[j]是属于某公共子串的最后一个字符, //那么一定有str1[i]==str2[j] && str1[i-1] == str2[j-1], //从矩阵中直观的看,就是由“1”构成的“斜线”代表的序列都是公共子串, //那么最长公共子串肯定就是斜线“1”最长的那个串。 public class LongestCommonSequence { /** * @param args */ private int end1 = 0; private int end2 = 0; public static void main(String[] args) { // TODO Auto-generated method stub Scanner scan = new Scanner(System.in); String s1 = scan.next(); String s2 = scan.next(); LongestCommonSequence lcs = new LongestCommonSequence(); System.out.println(lcs.longestCommonSequence(s1, s2)); } private String longestCommonSequence(String s1, String s2) { if (s1 == null || s1.length() == 0 || s2 == null || s2.length() == 0) { return null; } int[][] equals = new int[s1.length()][s2.length()]; for (int i = 0; i < s1.length(); i++) { for (int j = 0; j < s2.length(); j++) { if (s1.charAt(i) == s2.charAt(j)) { equals[i][j] = 1; } else { equals[i][j] = 0; } } } int longestlen = getLongesPosition(equals, s1.length(), s2.length()); System.out.println(longestlen + " " + end1); return s1.substring(end1 - longestlen + 1, end1 + 1); } private int getLongesPosition(int[][] equals, int len1, int len2) { int max = 0; for (int i = 0; i < len1; i++) { int flag = i; int len = 0; for (int j = 0; j < (int) Math.min(len1, len2) && flag < len1; j++) { if (equals[flag][j] == 1) { len++; } else { if (len > max) { max = len; end1 = flag - 1; end2 = j - 1; } len = 0; } flag++; } } for (int i = 1; i < len2; i++) { int flag = i; int len = 0; for (int j = 0; j < (int) Math.min(len1, len2) && flag < len2; j++) { if (equals[j][flag] == 1) { len++; } else { if (len > max) { max = len; end1 = j - 1; end2 = flag - 1; } len = 0; } flag++; } } return max; } }
相关文章推荐
- Longest Consecutive Sequence (最长连续序列) 【面试算法leetcode】
- Longest Consecutive Sequence(最长连续序列)
- 【算法导论学习-29】动态规划经典问题02:最长公共子序列问题(Longest common subsequence,LCS)
- 【HDU 1159】Common Subsequence(最长公共序列LCS算法)
- LCS (Longest Common Subsequence) 字符串最长公共子串算法
- 常见算法问题之最长公共子串问题(Longest common substring problem)
- 数组中最长的连续序列(longest consecutive sequence)
- 128.LeetCode Longest Consecutive Sequence(hard)[数组 排序 最长连续增长子序列]
- 在无序序列中找出最长的连续序列 Longest Consecutive Sequence
- leetcode 最长连续序列 longest consecutive sequence
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- LCS (Longest Common Subsequence) 字符串最长公共子串算法
- 【LeetCode-面试算法经典-Java实现】【014-Longest Common Prefix(最长公共前缀)】
- [LeetCode] Binary Tree Longest Consecutive Sequence II 二叉树最长连续序列之二
- 利用后缀树求多个字符串的最长公共连续子串(Longest Common Substring)
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串 (转)
- 求数组中最长的连续序列(Longest Consecutive Sequence )
- ] 找工作知识储备(2)---数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 最长递增子序列(nlogn),最长公共子串(连续),最长公共子序列(不连续)
- [LintCode] Longest Consecutive Sequence 求最长连续序列