Проверка логической ошибки анаграммы - похоже, не удается найти ошибку - PullRequest
1 голос
/ 13 марта 2020
public class AnagramUnoptimized {
  public static void main(String[] args) {

    String a  = "good";
    String b  = "ogod";
    boolean isAnagram = false;

    String c = a.toLowerCase();
    String d = b.toLowerCase();

    if(c.length()==d.length()) {
        boolean [] Visited = new boolean[a.length()];
        for (int i = 0; i < c.length(); i++) {
            isAnagram = false;
            for (int j = 0; j < d.length(); j++) {
                if (c.charAt(i) == d.charAt(j) && Visited[j]==false) {
                    isAnagram = true;
                    Visited[j] = true;
                }
            }
            if (isAnagram == false) {
                break;
            }
        }
    }
    if(isAnagram==true){
        System.out.println("The given Strings are Anagrams");
    }
    else{
        System.out.println("The given Strings are not Anagrams");
    }

  }
}

Я использовал логический массив Visited для проверки повторяющихся элементов, но теперь он показывает «Не анаграмма» для всех входных данных ...

Можете ли вы сказать мне, почему он показывает «Не анаграмма», если строки имеют повторяющиеся элементы ??

Ответы [ 2 ]

3 голосов
/ 13 марта 2020

Проблема с вашим кодом в том, что вы продолжаете работу с l oop, даже если visited[j] изменяется на true, тогда как вам нужно разбить внутренний l oop на этом этапе. Сделайте это следующим образом:

for (int j = 0; j < d.length(); j++) {
    if (c.charAt(i) == d.charAt(j) && visited[j] == false) {
        isAnagram = true;
        visited[j] = true;
        break;
    }
}

Вывод после этого изменения:

The given Strings are Anagrams

Лучший способ сделать это будет следующим:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        String a = "good";
        String b = "ogod";

        char[] first = a.toLowerCase().toCharArray();
        char[] second = b.toLowerCase().toCharArray();
        Arrays.sort(first);
        Arrays.sort(second);

        boolean isAnagram = Arrays.equals(first, second);

        if (isAnagram == true) {
            System.out.println("The given Strings are Anagrams");
        } else {
            System.out.println("The given Strings are not Anagrams");
        }
    }
}

Выход:

The given Strings are Anagrams
0 голосов
/ 13 марта 2020

В вашем коде вы должны разбить внутреннее для l oop, когда условие "if (c .charAt (i) == d.charAt (j) && Visited [j] == false)" было выполнено встретиться. Поскольку он все еще проходит через второе перемешивание, и если он встретит один и тот же символ один раз, он изменит значение Visited [] на true два раза, что приведет к ошибке. В этом примере это случай с char 'o'. Добавление «break;» в конце оператора if должно решить проблему.

...