Anagramas encontrar em java

encipher:

I preso em um problema. Eu tenho uma matriz de String, que é composto por String[]={"eat", "tea", "tan", "ate", "nat", "bat"}agora, eu deveria segregados aqueles palavra que tem mesma letra nele e fazer um grupo. eat,tea,ateeles têm a mesma letra de cada palavra de modo que este é um grupo. Grupo 2 deve ser tan,nate Group3 deve ser bat. Então eu tenho de fazer uma lista de lista de armazenar esses grupos.

Minha abordagem:

Para resolver este problema I primeiro descobrir os valores ASCII de cada letra e, em seguida, adicionar os valores ASCII para uma palavra. Como eatdescobrir os valores ASCII de e,a,te adicioná-los. Aproveito esta abordagem, porque se as letras são repetidos nas palavras, então eles devem ter mesma soma ascii. Após esse grupo eu os mesmos somas ASCII e descobrir quais as palavras têm esses montantes, então eles pertence mesmo grupo.

Meu progresso eu descobrir somas ascii e colocá-los em um hashmap. Mas então eu não poderia grupo os mesmos valores. Como eu não conseguiram agrupar os valores ASCII não consigo descobrir o words.I não tem nenhum indício de como proceder.

Eu também acompanhar as mensagens deste

post1 pós2

Mas não se aproximar e minha abordagem não é mesmo. Também as perguntas são diferentes dos meus. Eu estou discutindo aqui sobre uma abordagem diferente que é depender de valores ASCII.

Meu 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);

    }

}

Um mais se aproximam para transferir as chaves de mapa em um ArrayList e mapear valores em um ArrayList. Algo parecido,

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

Em seguida, usando dois loops e colocar os mesmos valores em outra 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));
            }
        }

Agora, se eu imprimir dup saída será [314, 314, 314, 323]que é parcialmente correta. Deveria ser314,314,314,323,323,311

Hades:

Com base na abordagem asci Fiz um código de trabalho

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);
    }

Isto vai dar resultado

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

mas se encontramos personagens diff com soma mesmo valor asci como 10 + 11 = 20 + 1 código abaixo funciona onde com base na cadeia ordenada fazemos o mapa resultado

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);
    }

Isso irá retornar

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

Eu fixo os comentários e edições fornecidas.

Acho que você gosta

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