простой алгоритм поиска анаграммы - PullRequest
0 голосов
/ 27 августа 2018
public class anagrm {
public static void main(String args[]){
    String s1 = new String();
    String s2 = new String();
    int count = 0;
    Scanner sc = new Scanner(System.in);
    s1 = sc.nextLine();``
    s2 = sc.nextLine();
    if(s1.length()==s2.length())
        for (int i = 0; i < s1.length(); i++)
            for (int j = 0; j < s1.length(); j++)
                if (s1.charAt(i) == s2.charAt(j)){
                    count++
                }

    if(count>=s1.length())
        System.out.println("string is anagram");
    else
        System.out.println("string is not anagram");
    System.out.println(count);
}


}

это верно для армии и марр .. я понял, где ошибка, но я хочу завершить таким образом ...

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Как уже упоминали другие, ваша переменная count увеличивается каждый раз, когда буквы совпадают, независимо от того, сколько раз s1 имеет букву. Если вы хотите использовать решение для подсчета, вам нужно увеличить число для каждой буквы:

import java.util.HashMap
import java.util.Map

/* This is how to declare HashMap */
HashMap<char, String> s1map = new HashMap<char, String>();
HashMap<char, String> s2map = new HashMap<char, String>();

for (int j = 0; j < s1.length(); j++){
    //We create 2 hashmaps to count the number of each char in each word separately
    s1map.put(key, s1map.getOrDefault(key, 0) + 1);
    s2map.put(key, s2map.getOrDefault(key, 0) + 1);
}

Наконец, вы можете сравнить получившиеся карты с:

if s1map.equals(s2map){
    print("They are anagrams")
}
else{
    print("They are not anagrams")
}
0 голосов
/ 27 августа 2018

Вы сталкиваетесь с ошибками, так как каждый раз, когда в s1 буква появляется более одного раза, вы увеличиваете счетчик каждый раз, даже если s2 имеет эту букву только один раз. Одним из способов решения этой проблемы является использование StringBuilder вместо этого, и, когда вы найдете совпадение в письмах, удалите эту букву из s2, используя метод deleteCharAt. Чтобы сделать это, вам также нужно изменить второй цикл for, чтобы вместо него повторить s2.length, так как он будет постоянно сокращаться. Не очень элегантно, но это будет работать.

...