最长公共子串问题(可输出多个子串)
2016-10-22 19:12
197 查看
//最长公共子串,可输出多个 public class TestLCS { public static void getLCString(char[] str1, char[] str2) { int i, j; int len1, len2; len1 = str1.length; len2 = str2.length; int maxLen = len1 > len2 ? len1 : len2; int[] max = new int[maxLen]; int[] maxIndex = new int[maxLen]; int[] c = new int[maxLen]; // 记录对角线上的相等值的个数 for (i = 0; i < len2; i++) { for (j = len1 - 1; j >= 0; j--) { if (str2[i] == str1[j]) { if ((i == 0) || (j == 0)) c[j] = 1; else c[j] = c[j - 1] + 1; } else { c[j] = 0; } if (c[j] > max[0]) { // 如果是大于那暂时只有一个是最长的,而且要把后面的清0; max[0] = c[j]; // 记录对角线元素的最大值,之后在遍历时用作提取子串的长度 maxIndex[0] = j; // 记录对角线元素最大值的位置 //每一组max[k]和maxindex[k]对应记录了一组最长子串,如果发现c[j]>max[0],则之前记录的当前找到的最长子串都失效,所以要清空 for (int k = 1; k < maxLen; k++) { max[k] = 0; maxIndex[k] = 0; } } else if (c[j] == max[0]) { // 有多个是相同长度的子串 //每一组max[k]和maxindex[k]对应记录了一组最长子串 for (int k = 1; k < maxLen; k++) { if (max[k] == 0) { max[k] = c[j]; maxIndex[k] = j; break; // 在后面加一个就要退出循环了 } } } } } for (j = 0; j < maxLen; j++) { if (max[j] > 0) { System.out.println("第" + (j + 1) + "个公共子串:"); for (i = maxIndex[j] - max[j] + 1; i <= maxIndex[j]; i++) System.out.print(str1[i]); System.out.println(" "); } } } public static void main(String[] args) { String str1 = new String("abcd"); String str2 = new String("dcba"); getLCString(str1.toCharArray(), str2.toCharArray()); } }
相关文章推荐
- 问题:求两个字符串的最长公共子串。 要求:输入两个字符串,输出它们的最长公共子串,包括长度。
- 问题:求两个字符串的最长公共子串。 要求:输入两个字符串,输出它们的最长公共子串,包括长度。 设计: 设计一个类 String,包括一个 len(字符串长度)和字符串指针 s。另有如下成员函数: ·
- Java动态规划求解最长公共子串问题
- 最长公共子串问题
- 输入3个子串, 输出这3个子串的最大公共子串
- SPOJ1811最长公共子串问题(后缀自动机)
- 求两个字符串最长公共子串的问题
- 求两个字符串最长公共子串(LCS问题) 两种思想
- 动态规划-最长公共子串问题的实现
- 最长公共子串问题的实现
- SPOJ1811最长公共子串问题(后缀自动机)
- VB6求两个字符串最长公共子串的问题
- 最长公共子串问题的后缀数组解法
- 求最长公共子串问题的算法分析--《计算机仿真》2007年12期
- 最长公共子串问题
- 动态规划求解最长公共子串问题
- 最长公共子串问题 LCS
- 最长公共子串问题的后缀数组解法
- Poj 3294 Life Forms (后缀数组 在n个串中出现k次的最长公共子串并输出)
- 动态规划-最长公共子串问题-java版