求两个字符串最长公共字串
2014-07-21 15:45
274 查看
package com.test; //求两个字符串最长公共字串, //算法:两个字符串形成一个矩阵,将两个字符不匹配的位置标记为0,c[i][j]中两个字符相匹配的位置标记为n,其中n=c[i-1][j-1]+1, //其中沿正对角线方向最长的序列为两个字串的最长公共子序列 public class Lcs { public static void main(String[] args) { // String s1 = "523311212322324"; // String s2 = "312123223445"; String s1 = "12123221"; String s2 = "312123226"; char[] c1 = s1.toCharArray(); char[] c2 = s2.toCharArray(); Lcs lcs = new Lcs(); System.out.println(lcs.execute(c1, c2)); } public String execute(char[] c1, char[] c2) { int[][] c = new int[M][M]; int start = 0; // 记录公共子串的起始位置 int end = 0;// 记录公共子串的结束位置 int maxLength = 0;// 记录最长公共子串的长度 for (int i = 0; i < c1.length; i++) { for (int j = 0; j < c2.length; j++) { if (c1[i] == c2[j]) { if (i == 0 || j == 0) { c[i][j] = 1; } else { c[i][j] = c[i - 1][j - 1] + 1; // System.out.print(c[i][j]+" "); } } else { c[i][j] = 0; } if (c[i][j] > maxLength) { maxLength = c[i][j]; end = j; } } } start = end - maxLength + 1; char[] p = new char[maxLength]; for (int k = start; k <= end; k++) { p[k - start] = c2[k]; } return String.valueOf(p); } private final int M = 20; }
相关文章推荐
- 求两个字符串的最长公共字串(连续)
- 计算两个字符串的最大公共字串的长度,字符不区分大小写(要求计算连续最长字串的长度)
- POJ 2774 Long Long Message(后缀数组 两个字符串的最长公共字串 )
- 利用后缀数组求字符串的最长重复子串的算法 利用二维数组求两个字符串的最长公共字串(动态规划)
- 求两个字符串S和T的一个最长公共字串
- 两个字符串最长的公共字串问题(LCS)
- java_基础知识_字符串练习题_计算两个字符串的最长公共字串长度
- 华为OJ 公共字串计算&&查找两个字符串a,b中的最长公共子串
- 重复子串问题(四):求两个字符串的最长公共字串
- 计算两个字符串的最长公共字串长度(java编程)
- 求两个字符串的最长公共字串(连续)
- [SID-EXAM]利用后缀数组求两个字符串的最长公共子串,较dp效率要高
- 利用后缀数组求字符串中的最长公共字串——编程珠玑15章
- 实用算法实现-第 8 篇 后缀树和后缀数组 [3 两个字符串的最长公共子串]
- 求两个字符串的最大公共字串
- VB6求两个字符串最长公共子串的问题
- 算法:用数组求两个字符串最长的公共子串
- Exe 求两个字符串的最大公共字串
- 后缀树和后缀数组 [3 两个字符串的最长公共子串]
- 求出两个字符串的最长公共子串