[Una pregunta del día] Likou 205: Cadena isomórfica

Descripción del título ( portal )

Dadas dos cadenas s y t, determina si son isomórficas.

Si los caracteres en s se pueden reemplazar para obtener t, entonces las dos cadenas son isomorfas.

Todas las apariciones de caracteres deben ser reemplazadas por otro carácter preservando el orden de los caracteres. No se pueden asignar dos personajes al mismo personaje, pero el personaje se puede asignar a sí mismo.

Ejemplo

Ejemplo 1:

输入: s = "egg", t = "add"
输出: true

Ejemplo 2:

输入: s = "foo", t = "bar"
输出: false

Ejemplo 3:

输入: s = "paper", t = "title"
输出: true

Ideas para resolver problemas

Un ejemplo de error

En primer lugar, el título trata sobre personajes, por lo que debemos prestar atención no solo a las letras, sino a varios caracteres. Echemos un vistazo a la tabla de códigos ASIC.
Inserte la descripción de la imagen aquí
Aquí hay un total de 128 caracteres. Cuando se inicializa la matriz, deberíamos tener un tamaño de 128 en lugar de 26.
Inicializamos dos matrices con un tamaño de 128, luego atravesamos las dos cadenas y luego contamos cada carácter, y luego en la matriz Sume 1. El tamaño en la matriz al juzgar la posición correspondiente de la cadena.

 public boolean isIsomorphic(String s, String t) {
    
    
      int[] sarray = new int[128];
        int[] tarray = new int[128];
        
        if (s.length() != t.length()) {
    
    
            return false;
        }
        for (int i = 0; i < s.length(); i++) {
    
    
            if (sarray[s.charAt(i)] != tarray[t.charAt(i)]) {
    
    
                return false;
            }
            sarray[s.charAt(i)] ++;
            tarray[t.charAt(i)] ++;
        }
        return true;
    }

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
De esta manera, no hay ningún problema con el Ejemplo 1, pero el envío no se puede aprobar por completo.
Inserte la descripción de la imagen aquí
Por ejemplo, si
s = "aba"
t = "baa",
Inserte la descripción de la imagen aquí
se juzga que el número de ellos es siempre el mismo, por lo que se devuelve verdadero y falso si es correcto.
Esto se debe a que los dos primeros ab y ba conducen al paso anterior de la siguiente manera:Inserte la descripción de la imagen aquí

Pensamiento correcto

Cada vez que se incrementa en 1, es imposible distinguir qué operación de ciclo se realizó. Este problema se puede resolver si el número agregado en cada ciclo es diferente, pero las posiciones de los caracteres correspondientes en las dos matrices se agregan con el mismo número.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Por lo tanto, solo necesitamos agregar un valor cambiado cada vez que se repite el ciclo sin repetirlo. Podemos definir un valor por separado, pero el valor de i en el ciclo siempre cambia, y sumar i no se repite una vez.

Código de implementación

 public boolean isIsomorphic(String s, String t) {
    
    
      int[] sarray = new int[128];
        int[] tarray = new int[128];
        
        if (s.length() != t.length()) {
    
    
            return false;
        }
        for (int i = 0; i < s.length(); i++) {
    
    
            if (sarray[s.charAt(i)] != tarray[t.charAt(i)]) {
    
    
                return false;
            }
            sarray[s.charAt(i)] = i + 1 ;
            tarray[t.charAt(i)] = i + 1;
        }
        return true;
    }

Teniendo en cuenta que i empieza desde 0, la discriminación no es suficiente. Entonces agregue 1, aquí 1 se puede cambiar a voluntad.

HashMap

Aquí se utilizan dos HashMaps, según el código, no explicado.

public boolean isIsomorphic(String s, String t) {
    
    
        Map<Character, Character> s2t = new HashMap<Character, Character>();
        Map<Character, Character> t2s = new HashMap<Character, Character>();
        int len = s.length();
        for (int i = 0; i < len; ++i) {
    
    
            char x = s.charAt(i), y = t.charAt(i);
            if ((s2t.containsKey(x) && s2t.get(x) != y) || (t2s.containsKey(y) && t2s.get(y) != x)) {
    
    
                return false;
            }
            s2t.put(x, y);
            t2s.put(y, x);
        }
        return true;
    }


Supongo que te gusta

Origin blog.csdn.net/weixin_45532227/article/details/111830801
Recomendado
Clasificación