LeetCode-839. Grupos de cadenas similares-Análisis y código (Java)

LeetCode-839. Grupos de cadenas similares [Grupos de cadenas similares] -Análisis y código [Java]

1. Tema

Si las letras en dos posiciones diferentes en la cadena X se intercambian para hacerla igual a la cadena Y, entonces se dice que las dos cadenas X e Y son similares. Si las dos cadenas en sí son iguales, también son similares.
Por ejemplo, "alquitranes" y "ratas" son similares (intercambia las posiciones de 0 y 2); "ratas" y "artes" también son similares, pero "estrella" no es lo mismo que "alquitranes", "ratas", o "artes" similares.
En resumen, formaron dos grupos de asociación por similitud: {"tars", "rats", "arts"} y {"star"}. Tenga en cuenta que los "alquitranes" y las "artes" están en el mismo grupo, incluso si no son similares. Formalmente, para cada grupo, para determinar una palabra en el grupo, solo necesita ser similar a al menos una palabra en el grupo.
Le da una lista de cadenas de caracteres. Cada cadena de la lista es una letra de dislexia de todas las demás cadenas de cadenas. ¿Cuántos grupos de cuerdas similares hay en strs?

Ejemplo 1:

输入:strs = ["tars","rats","arts","star"]
输出:2

Ejemplo 2:

输入:strs = ["omv","ovm"]
输出:1

inmediato:

  • 1 <= strs.length <= 100
  • 1 <= strs [i] .length <= 1000
  • suma (cadenas [i]. longitud) <= 2 * 104
  • strs [i] contiene solo letras minúsculas.
  • Todas las palabras en strs tienen la misma longitud y son palabras diáfanas entre sí.

Observaciones: anagrama, una nueva palabra formada cambiando la posición (orden) de las letras de una cadena.

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/similar-string-groups Los
derechos de autor son propiedad de LeetCode . Para reimpresiones comerciales, comuníquese con la autorización oficial. Para reimpresiones no comerciales, indique la fuente.

Dos, análisis y código

1. Combinar

(1) Pensando

Registre la relación de asociación entre las cadenas a través de la verificación combinada y cuente el número de grupos de asociación.

(2) Código

class Solution {
    
    
    public int numSimilarGroups(String[] strs) {
    
    
        int n = strs.length;
        int[] parent = new int[n];
        for (int i = 0; i < n; i++)
            parent[i] = i;

        for (int i = 0; i < n; i++) {
    
    
            for (int j = i + 1; j < n; j++)
                if (find(parent, i) != find(parent, j))
                    if (check(strs[i], strs[j]))
                        union(parent, i, j);
        }

        int ans = 0;
        for (int i = 0; i < n; i++)
            if (parent[i] == i)
                ans++;
        return ans;       
    }

    public boolean check(String str1, String str2) {
    
    
        int diff = 0;//字符串都是字母异位词,只需判断各位不同字母的个数
        for (int i = 0; i < str1.length(); i++)
            if (str1.charAt(i) != str2.charAt(i)) {
    
    
                diff++;
                if (diff > 2)
                    return false;
            }
        return true;
    }

    public int find(int[] parent, int i) {
    
    
        if (parent[i] != i)
            parent[i] = find(parent, parent[i]);
        return parent[i];
    }

    public void union(int[] parent, int s1, int s2) {
    
    
        parent[find(parent, s2)] = find(parent, s1);
    }
}

(3) Resultados

Tiempo de ejecución: 13 ms, superando al 95,14% de los usuarios
en todos los envíos de Java ; consumo de memoria: 38,2 MB, superando al 58,87% de los usuarios en todos los envíos de Java.

Tres, otro

Nada.

Supongo que te gusta

Origin blog.csdn.net/zml66666/article/details/113797870
Recomendado
Clasificación