La subcadena más larga (LCS) de programación dinámica

La subcadena más larga (LCS) del problema de programación dinámica


Ingrese dos cadenas, cadena1 y cadena2, para encontrar la subcadena repetida más larga.


Seleccione una de las cadenas de caracteres y compare con cada carácter de la otra cadena de caracteres del primer carácter, el mismo es 1 y la diferencia es 0, construya la primera línea. Luego, el segundo personaje finalmente se construye en una matriz bidimensional.

p.ej:

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

    0  0  0
    0  1  0
    0  0  1

Se puede calcular que la subcadena más larga tiene 2 de longitud y aC

Para facilitar la obtención de la subcadena más larga al final, si una posición es la misma, deje que el tamaño de la matriz bidimensional en esta posición sea el valor de la esquina superior izquierda +1

Entonces la matriz bidimensional original se convierte en:

0 0 0
0 1 0
0 0 2

Use una matriz de [1] [1] para registrar la posición de la matriz 2 (la matriz comienza en 0). Si la longitud es 2, la subcadena máxima es la posición 2 + 1, la longitud 2 comienza en la posición 2 + 1

Finalmente, para obtener la subcadena más larga, hay múltiples recorridos de estos datos bidimensionales.

código (implementación de 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);
}
Publicado 21 artículos originales · ganó 24 · vistas 20,000 +

Supongo que te gusta

Origin blog.csdn.net/qq_30332665/article/details/73730668
Recomendado
Clasificación