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.
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;
}
De esta manera, no hay ningún problema con el Ejemplo 1, pero el envío no se puede aprobar por completo.
Por ejemplo, si
s = "aba"
t = "baa",
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:
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.
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;
}