Anagramas encontrar en Java

encipher:

Me quedé en un problema. Tengo una matriz de cadenas, que es consiste String[]={"eat", "tea", "tan", "ate", "nat", "bat"}Ahora, debe segregado los que tienen la palabra misma letra en él y hacer un grupo. eat,tea,ateque tienen la misma letra en cada palabra por lo que este es un grupo. Grupo 2 debe ser tan,naty debe ser Group3 bat. Así que tengo que hacer una lista de lista para almacenar esos grupos.

Mi acercamiento:

Para resolver este problema que se enteran de los valores ASCII de cada letra y luego añadir los valores ASCII de una palabra. Como eataveriguar los valores ASCII de e,a,ty añadirlos. Puedo tomar este enfoque porque si las letras se repiten en las palabras, entonces deben tener la misma suma ascii. Después de que el grupo les mismas sumas ASCII y averiguar qué palabras tienen esas sumas a continuación, que pertenece al mismo grupo.

Mi progreso me entero de sumas ascii y ponerlos en un HashMap. Pero entonces yo no podía agrupar los mismos valores. Como no pude agrupar los valores ascii no puedo averiguar la words.I no tienen idea de cómo proceder.

También sigo esta mensajes

post1 post2

Pero no se acercan y mi enfoque no es igual. También las preguntas son diferentes de la mía. Yo estoy hablando aquí de un enfoque diferente que es depende de los valores ASCII.

Mi código:

public List<List<String>> groupAnagrams(String[] strs) {
    ArrayList<Character>indivistr=new ArrayList<>();
    ArrayList<Integer>dup=new ArrayList<>();
    HashMap<Integer,Integer>mappingvalues=new HashMap<>();
    for(int i=0;i<strs.length;i++){
        int len=strs[i].length();
        int sum=0;
        for(int j=0;j<len;j++){
            indivistr.add(strs[i].charAt(j));
            int ascii=(int)strs[i].charAt(j);
            sum=sum+ascii;

        }
        mappingvalues.put(i,sum);

    }

}

Una acercar más puedo transferir las claves en un mapa Arraylist y asignar los valores en un ArrayList. Algo como eso,

ArrayList<Integer>key_con=new ArrayList< (mappingvalues.keySet()); ArrayList<Integer>val_con=new ArrayList<>(mappingvalues.values());

Luego, utilizando dos bucles y poner los mismos valores en otra lista.

for(int k=0;k<val_con.size();k++){
        for(int k1=k+1;k1<val_con.size();k1++){
            if(val_con.get(k).equals(val_con.get(k1))){
                dup.add(val_con.get(k1));
            }
        }

Ahora bien, si puedo imprimir DUP salida será [314, 314, 314, 323]que es parcialmente correcta. Debería ser314,314,314,323,323,311

Hades:

Basado en el enfoque ascos he hecho un código de trabajo

public static void main(String[] args) {
        String[] values ={"eat", "tea", "tan", "ate", "nat", "bat"};
        Map<Integer, List<String>> resultMap = new HashMap<Integer, List<String>>();
        for (String value : values) {
            char[] caharacters = value.toLowerCase().toCharArray();
            int asciSum = 0;
            for (char character : caharacters) {
                asciSum = asciSum + (int)character;
            }
            System.out.println(asciSum);
            if(resultMap.containsKey(asciSum)) {
                resultMap.get(asciSum).add(value);
            }else {
                List<String> list = new ArrayList<String>();
                list.add(value);
                resultMap.put(asciSum, list);
            }
        }
        System.out.println(resultMap);
    }

Esto dará resultado

{323=[tan, nat], 311=[bat], 314=[eat, tea, ate]}

pero si nos encontramos con personajes diff con ascos mismo valor como suma 10 + 11 = 20 + 1 siguiente código funcionará en base a la secuencia ordenada hacemos la correlación de resultados

public static void main(String[] args) {
        String[] values ={"eat", "tea", "tan", "ate", "nat", "bat"};
        Map<String, List<String>> resultMap = new HashMap<String, List<String>>();
        for (String value : values) {
            char[] caharacters = value.toLowerCase().toCharArray();
            Arrays.sort(caharacters);
            String sortedValue = new String(caharacters);
            System.out.println(sortedValue);
            if(resultMap.containsKey(sortedValue)) {
                resultMap.get(sortedValue).add(value);
            }else {
                List<String> list = new ArrayList<String>();
                list.add(value);
                resultMap.put(sortedValue, list);
            }
        }
        System.out.println(resultMap);
    }

Esto devolverá

{aet=[eat, tea, ate], abt=[bat], ant=[tan, nat]}

He fijado los comentarios y las modificaciones previstas.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=215486&siteId=1
Recomendado
Clasificación