最长公共字符串

xiaoxiao2021-02-27  131

网上有不少求最小公共字符串的算法,自己实现了一个。此处仅提供代码实现:

package com.wsy.dynamic; import java.util.Arrays; public class DynamicImprove { /** * 求2个字符串最长公共字符核心方法 * @param str1 * @param str2 * @param n * @param m */ public void printMaxStr(String str1, String str2, int n, int m){ //验证参数 validateParams(str1, str2, n, m); char[] a = str1.toCharArray(); char[] b = str2.toCharArray(); int[][] c = new int[n+1][m+1]; int[] max = new int[m+1];//存储当前最长公共字符串的长度,可能有多个 int[] maxIndex = new int[m+1];//存储最长公共字符串的下标,用于打印输出 for(int i = 0;i<=m;i++){ c[0][i] = 0; } for(int i = 0;i<=n;i++){ c[i][0] = 0; } for(int i = 0;i<max.length;i++){ max[i] = 0; maxIndex[i] = 0; } for(int i = 1;i<=n;i++){ for(int j = 1;j<=m;j++){ if(a[i-1] == b[j-1]){//必然会出现不相等 c[i][j] = c[i-1][j-1] + 1; }else{ c[i][j] = 0; } //针对c[j]的结果来调整max,maxIndex数组 if(c[i][j] > max[0]){//如果c[j]大于max[0],则清空max,maxIndex,并且置max[0] = c[j],maxIndex[0] = j Arrays.fill(max, 0); Arrays.fill(maxIndex, 0); max[0] = c[i][j]; maxIndex[0] = j; }else if(c[i][j] == max[0]){ for(int h = 0;h<max.length;h++){ if(max[h] == 0){ max[h] = c[i][j]; maxIndex[h] = j; break;//一旦出现一次,强制退出循环 } } } } } //打印最长公共字符串 for(int i = 0;i<m;i++){ if(max[i] > 0){ int start = maxIndex[i] - max[i]; int end = maxIndex[i]; System.out.println("第" + (i+1) + "个最长公共字符串:" +str2.substring(start, end)); } } } /** * 验证参数 * @param str1 * @param str2 * @param n * @param m */ private void validateParams(String str1, String str2, int n, int m) { // 验证参数,略 } public static void main(String[] args) { DynamicImprove demo = new DynamicImprove(); demo.printMaxStr("12345", "12345", 5, 5); } }

代码经过测试,没有问题,需要的同学可以自己拷贝使用~

转载请注明原文地址: https://www.6miu.com/read-15721.html

最新回复(0)