Как сравнить все буквы в анаграммах в Java - PullRequest
0 голосов
/ 12 марта 2020

В течение 1 oop я хочу сравнить букву за буквой в первом слове со всеми буквами во втором слове. Я думал об этом в алфавитном порядке, но думаю, что это противоречит правилам.

import java.util.*;

public class Anagrams{

public static void main (String [ ] arg){

    Scanner Scan = new Scanner (System.in);
    //ask for thingss...am i allowed to use scanner?

    System.out.println("enter the first word");
    String word1 = Scan.nextLine().toLowerCase();

    System.out .println("enter the second word");
    String word2 = Scan.nextLine().toLowerCase();

    //make into string builder

    StringBuilder ThisWord = new StringBuilder ("");
    ThisWord.append(word1);

    StringBuilder ThatWord = new StringBuilder ("");
    ThatWord.append(word2);

    //do the booleanssss

    boolean lnth = true;
    boolean found = false;

    //see if they the same length
    if(ThisWord.length() != ThatWord.length())
    {
        lnth = false;
        System.out.println("sorry sis, "+ThatWord+" and "+ThisWord+" not the same length");
    }
    else
    {
        outerloop:
        for (int i = 0; i < ThisWord.length(); i++)
        {
        for (int j = 0; i < ThatWord.length(); i++)
            {
            found = false;

            if(ThisWord.charAt(i) == ThatWord){
                ThatWord.deleteCharAt(j);
                found = true;
                break;
            }
            else{
                System.out.println(ThisWord+" and "+ThatWord+" not anagrams - letters do not match");
                found = false;
                break outerloop;
            }

            }

        }
    }

Ответы [ 3 ]

2 голосов
/ 12 марта 2020

Можем ли мы использовать что-то вроде этого:

public class Anagrams
{
    public static void main(String[] args)
    {
        System.out.println(checkAnagram("abc","cba"));
        System.out.println(checkAnagram("abca","cba"));
        System.out.println(checkAnagram("abd","cba"));
        System.out.println(checkAnagram("otp","pot"));
        System.out.println(checkAnagram("poo","oop"));
    }

    private static boolean checkAnagram(String first, String second)
    {
        if(first.length()!=second.length())
            return false;
        int []  alphabet = new int [26];
        for(int i= 0;i< first.length();i++ )
        {
            alphabet[first.charAt( i ) - 97]++;
            alphabet[second.charAt( i ) - 97]++;
        }

        for(int i =0 ;i< alphabet.length;i++)
        {
            if(alphabet[i] % 2!=0)
            {
               return false;
            }
        }
        return  true;

    }
}

1 голос
/ 12 марта 2020

Одним из решений может быть назначение простых чисел буквам алфавита (скажем, это , где первый столбец должен быть символами в алфавите, а другие, очевидно, простыми числами). Поместите их в HashMap<Character, Integer>. Давайте назовем это PRIME_MAP. Это должно выглядеть как a -> 2, b -> 3, c -> 5, ...

Вы создаете 2 for циклов. В каждом из них вы перебираете ThisWord и ThatWord соответственно.

Вы создаете произведение из букв слов примерно так:

int thisWordProduct = 1;
for(int i = 0; i < ThisWord.length(); i++) {
    thisWordProcuct *= PRIME_MAP.get(thisWordProduct.charAt(i);
}

И аналогично для других.

Если 2 произведения равны, 2 слова являются анаграммами.

Это решение может быть немного более абстрактным, чем предложили другие, но оно должно быть более оптимальным, чем вложенные циклы

1 голос
/ 12 марта 2020

Несколько методов, которые вы можете рассмотреть. Способ 1. Сортировка строк по алфавиту и последующее сравнение.

Метод 2 - Создание вспомогательного массива. Для каждого символа в первой строке вы увеличиваете значение в массиве [charValue] на 1. Для каждого символа во второй строке вы уменьшаете значение в массиве [charValue]. Если это анаграмма, вы получите массив, который будет заполнен нулями в конце.

Метод 3 - итерация символов первой строки и удаление символа из второй строки при обнаружении. Если str2.isEmpty () -> Анаграмма.

...