@evg_96

Как найти все анаграммы в слове?

Читаю книгу "Алгоритмы и структуры данных Java". Дошел до темы "рекурсия". В данной главе приводится пример программы нахождения анаграмм из слова.
Но проблемы в том что описание данного алгоритма очень скудное. Не могу разобраться самостоятельно по данному материалу. Подскажите пожалуйста ссылку на материал где доступно объясняется данный алгоритм нахождения анаграмм или опишите своими словами. Конкретно непонятно почему выводится слово только при newSize == 2 и непонятна работа циклического сдвига (метод rotate()).

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class App {
    static int size;
    static int count;
    static char[] arr = new char[100];

    public static void main(String[] args) throws IOException {
        System.out.print("Enter a word: ");

        String input = getString();

        size = input.length();
        count = 0;

        for (int i = 0; i < size; i++) {
            arr[i] = input.charAt(i);
        }

        doAnagram(size);
    }

    public static void doAnagram(int newSize) {
        if (newSize == 1) {
            return;
        }

        for (int i = 0; i < newSize; i++) {
            doAnagram(newSize - 1);

            if (newSize == 2) {
                displayWord();
            }

            rotate(newSize);
        }
    }

    public static void rotate(int newSize) {
        int i;
        int position = size - newSize;
        char temp = arr[position];

        for (i = position + 1; i < size; i++) {
            arr[i - 1] = arr[i];
        }

        arr[i - 1] = temp;
    }

    public static void displayWord() {
        if (count < 99) {
            System.out.print(" ");
        }

        if (count < 9) {
            System.out.print(" ");
        }

        System.out.print(++count + " ");

        for (int i = 0; i < size; i++) {
            System.out.print(arr[i]);
        }

        System.out.print("   ");
        System.out.flush();

        if (count % 6 == 0) {
            System.out.println("");
        }
    }

    public static String getString() throws IOException {
        InputStreamReader stream = new InputStreamReader(System.in);
        BufferedReader in = new BufferedReader(stream);

        return in.readLine();
    }
}
  • Вопрос задан
  • 1507 просмотров
Пригласить эксперта
Ответы на вопрос 1
@red-barbarian
Это просто перестановки.

rotate сдвигает циклично n последних элементов.
например. если n = size, то 0 элемент станет последним, 1->0, 2->1 итд.
если n=size-m, size-m-> последним, size-m+1->size-m, ...
понятно, что при n = 1 ничего не делается.
doAnagram.
при doAnagram(1) - возврат из рекурсии, так как ничего не делает.

при doAnagram(n) - мы циклично сдвигаем получая n случаев arr - каждый начинается с новой буквы arr[i] , i =0..n-1
анаграммы для этих случаев будут arr[i] + doAnagram(n-1)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы