La espada se refiere a la oferta 96: entrelazado de cuerdas

Pregunta:
Dadas tres cadenas s1, s2, s3, juzgue si s3 se puede intercalar (entrelazar) de s1 y s2.
La definición y el proceso de entrelazar dos cadenas s y t son los siguientes, donde cada cadena se divide en varias subcadenas no vacías:
s = s1 + s2 + … + sn
t = t1 + t2 + … + tm
|n - m| <= 1
entrelazado es s1 + t1 + s2 + t2 + s3 + t3 + … o t1 + s1 + t2 + s2 + t3 + s3 + …
Sugerencia: a + b significa que las cadenas a y b están concatenadas.
inserte la descripción de la imagen aquí
Ejemplo 1: Entrada: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
Salida: verdadero
Ejemplo 2: Entrada: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
Salida: falso
Ejemplo 3: Entrada: s1 = "", s2 = "", s3 = ""
Salida: verdadero
Análisis:
En cada paso, seleccione un carácter de la cadena s1 o s2 para entrelazar para producir un carácter en la cadena s3, luego el interleaving genera Cuántos pasos se requieren para todos los caracteres de la cadena s3 de , y cada paso puede elegir un carácter de la cadena s1 o un carácter de la cadena s2, es decir, cada paso puede enfrentar dos opciones. Este problema no requiere enumerar todos los métodos de entrelazar las cadenas s1 y s2 para obtener la cadena s3, sino solo determinar si las cadenas s1 y s2 se pueden entrelazar para obtener la cadena s3, solo determinar si existe la solución del problema, por lo que es dinámico plan para resolver el problema.
Determine la ecuación de transición de estado: si la última letra de la primera cadena es la misma que la última letra de la cadena compuesta, entonces f(i,j)=f(i-1,j), si la última letra de la segunda la cadena es la misma La letra es la misma que la última letra de la cadena compuesta, entonces f(i,j)=f(i,j-1). -1 para cadena vacía

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

Código:

public class IsInterleave {
    
    
    public static void main(String[] args) {
    
    
        String s1 = "aabcc";
        String s2 = "dbbca";
        String s3 = "aadbbcbcac";
        IsInterleave isInterleave = new IsInterleave();
        boolean interleave2 = isInterleave.isInterleave2(s1, s2, s3);
        System.out.println(interleave2);
    }
    public boolean isInterleave1(String s1, String s2, String s3) {
    
    
        if (s1.length() + s2.length() != s3.length()){
    
    
            return false;
        }
        boolean[][] dp = new boolean[s1.length()+1][s3.length()+1];
        dp[0][0] = true;
        for (int i = 0; i < s1.length(); i++) {
    
    
            dp[i+1][0] = s1.charAt(i) == s3.charAt(i)&&dp[i][0];
        }
        for (int i = 0; i < s2.length(); i++) {
    
    
            dp[0][i+1] = s2.charAt(i) == s3.charAt(i)&&dp[0][i];
        }
        for (int i = 0; i < s1.length(); i++) {
    
    
            for (int j = 0; j < s2.length(); j++) {
    
    
                char ch1 = s1.charAt(i);
                char ch2 = s2.charAt(j);
                char ch3 = s3.charAt(i+j+1);
                dp[i+1][j+1] = (ch1 == ch3 && dp[i][j+1]) || (ch2 == ch3 && dp[i+1][j]);
            }
        }
        return dp[s1.length()][s2.length()];
    }
//    优化空间效率
    public boolean isInterleave2(String s1, String s2, String s3){
    
    
        if (s1.length() + s2.length() != s3.length()){
    
    
            return false;
        }
        boolean[][] dp = new boolean[2][s3.length()+1];
        dp[0][0] = true;
        for (int i = 0; i < s2.length(); i++) {
    
    
            dp[0][i+1] = s2.charAt(i) == s3.charAt(i)&&dp[0][i];
        }
        for (int i = 0; i < s1.length(); i++) {
    
    
            dp[(i+1)%2][0] = s1.charAt(i) == s3.charAt(i)&&dp[i%2][0];
            for (int j = 0; j < s2.length(); j++) {
    
    
                char ch1 = s1.charAt(i);
                char ch2 = s2.charAt(j);
                char ch3 = s3.charAt(i+j+1);
                dp[(i+1)%2][j+1] = (ch1 == ch3 && dp[i%2][j+1]) || (ch2 == ch3 && dp[(i+1)%2][j]);
            }
        }
        return dp[s1.length()%2][s2.length()];
    }
//    接着优化空间效率
    public boolean isInterleave3(String s1, String s2, String s3){
    
    
        if (s1.length() + s2.length() != s3.length()){
    
    
            return false;
        }
        if (s1.length() < s2.length()){
    
    
            return isInterleave3(s2,s1,s3);
        }
        boolean[] dp = new boolean[s2.length() + 1];
        dp[0] = true;
//        相当于二维数组第一行
        for (int j = 0; j < s2.length(); j++) {
    
    
            dp[j+1] = s2.charAt(j) == s3.charAt(j)&&dp[j];
        }
        for (int i = 0; i < s1.length(); i++) {
    
    
//            相当于逐个判断二维数组第一列是true还是false
            dp[0] = dp[0] && s1.charAt(i) == s3.charAt(i);
            for (int j = 0; j < s2.length(); j++) {
    
    
                char ch1 = s1.charAt(i);
                char ch2 = s2.charAt(j);
                char ch3 = s3.charAt(i+j+1);
                dp[j+1] = (ch1 == ch3 && dp[j+1]) || (ch2 == ch3 &&dp[j]);
            }
        }
        return dp[s2.length()];
    }
}

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/Jiaodaqiaobiluo/article/details/123156290
Recomendado
Clasificación