最长公共子串问题(可输出多个子串)

来源:互联网 发布:widowns无法连接网络 编辑:程序博客网 时间:2024/04/29 16:09
//最长公共子串,可输出多个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;elsec[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());}}

0 0
原创粉丝点击