最长公共字符串

来源:互联网 发布:地图开疆 知乎 编辑:程序博客网 时间:2024/06/08 10:03

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

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);    }}

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

原创粉丝点击