Я застрял на проблеме.У меня есть массив строк, который состоит из String[]={"eat", "tea", "tan", "ate", "nat", "bat"}
Теперь я должен отделить те слова, которые имеют одинаковые буквы на нем, и создать группу.eat,tea,ate
у них одинаковые буквы в каждом слове, так что это группа.Группа 2 должна быть tan,nat
, а Группа3 должна быть bat
.Поэтому я должен составить список для хранения этих групп.
Мой подход:
Чтобы решить эту проблему, я сначала выясняю значения ascii для каждой буквы, а затем добавляю эти значения ascii для слова.Как и eat
, найдите значения ascii e,a,t
и добавьте их.Я использую этот подход, потому что если буквы повторяются в словах, то они должны иметь одинаковую сумму ascii.После этого я группирую те же суммы Ascii и выясняю, какие слова имеют эти суммы, тогда они принадлежат к той же группе.
Мой прогресс Я нахожу суммы ascii и помещаю их в хэш-карту.Но тогда я не смог сгруппировать одинаковые значения.Поскольку мне не удалось сгруппировать значения ascii, я не могу найти слова. Я понятия не имею, как поступить.
Я также следую за этими постами
post1 post2
Но там подход и мой подход не тот.Также вопросы отличаются от моих.Я обсуждаю здесь другой подход, который зависит от значений ASCII.
Мой код:
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);
}
}
Oneбольше подхода Я передаю ключи карты в Arraylist и значения карты в ArrayList.Примерно так:
ArrayList<Integer>key_con=new ArrayList<
(mappingvalues.keySet());
ArrayList<Integer>val_con=new ArrayList<>(mappingvalues.values());
Затем с помощью двух циклов и поместите те же значения в другой список.
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));
}
}
Теперь, если я напечатаю dup, вывод будет [314, 314, 314, 323]
, что частично правильно.Должно быть 314,314,314,323,323,311