動的プログラミングの最長部分文字列(LCS)

動的計画問題の最長部分文字列(LCS)


2つの文字列string1とstring2を入力して、最も長く繰り返されている部分文字列を検索します。


文字列の1つを選択し、最初の文字から他の文字列の各文字と比較します。同じは1、差は0であり、最初の行を構成します。次に、2番目の文字が最終的に2次元配列に構成されます。

例えば:

string1 = abc
String2 = dbc
得到的二维数组为 :

    0  0  0
    0  1  0
    0  0  1

最長の部分文字列の長さは2で、bcであると計算できます。

最後に最も長い部分文字列を簡単に取得するために、位置が同じである場合、この位置の2次元配列のサイズを左上隅の値+1にします。

次に、元の2次元配列は次のようになります。

0 0 0
0 1 0
0 0 2

[1] [1]の配列を使用して、配列の位置2を記録します(配列は0から始まります)。長さが2の場合、最大サブストリングは位置2 + 1です。長さ2は位置2 + 1で終わります。

最後に、最長の部分文字列を取得するために、この2次元データの複数の再トラバースがあります

コード(Java実装)

     public static void main(String argv[]) {
    Scanner scanner = new Scanner(System.in);

    String data1 = scanner.next();
    String data2 = scanner.next();
    byte[] a1 = data1.getBytes();
    byte[] a2 = data2.getBytes();

    int low_l = a1.length > a2.length ? a2.length : a1.length;

    int data[][] = new int[data2.length() > data1.length() ? data1.length() : data2.length()][getMax(data1, data2)];

    int max = 0;
    int max_index[][] = new int[2][3];

    //构造矩阵
    for (int i = 0; i < (data2.length() > data1.length() ? data1.length() : data2.length()); i++) {
        for (int j = 0; j < getMax(data1, data2); j++) {
            if (i < low_l && j < low_l && a1[i] == a2[j]) {
                if (j == 0 || i == 0) {
                    data[i][j] = 1;
                } else {
                    data[i][j] = data[i - 1][j - 1] + 1;
                }
            }
            if (data[i][j] > max) {
                max = data[i][j];
                max_index[0][0] = i;
                max_index[0][1] = max;
            }
        }
    }

    //查找子串
    for (int i = 0; i < (data2.length() > data1.length() ? data1.length() : data2.length()); i++) {
        for (int j = 0; j < getMax(data1, data2); j++) {
            if (data[i][j] == max) {
                System.out.println("最长子串 :" + MaxLcs(data1, i, max) + "   在第一个字符串的第" + (i + 2 - max) + "位开始");
            }
        }
    }
}

//最大值
static int getMax(String data1, String data2) {
    return data1.length() > data2.length() ? data1.length() : data2.length();
}

//得到子串
static String MaxLcs(String data, int index, int end) {
    return data.substring(index + 1 - end, index + 1);
}
21件の元の記事を公開 24 件を獲得 表示回数20,000回以上

おすすめ

転載: blog.csdn.net/qq_30332665/article/details/73730668