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,ate
eles têm a mesma letra de cada palavra de modo que este é um grupo. Grupo 2 deve ser tan,nat
e 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 eat
descobrir os valores ASCII de e,a,t
e 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
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
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.