Как найти все возможные анаграммы? - PullRequest
0 голосов
/ 29 августа 2018

Итак, я хочу сделать декодер анаграммы и узнать, есть ли лучший способ сделать это. Мой текущий код такой:

Random random = new Random();
char[] splitAnagram = chosenAnagram.toCharArray();
int[] presetNumbers = new int[chosenAnagram.length()];
int i = 0;
while (true) {
    TimeUnit.MILLISECONDS.sleep(10);
    int thisRandom = random.nextInt(chosenAnagram.length());
    if (Arrays.asList(presetNumbers).contains(thisRandom) == true)
        presetNumbers[i] = thisRandom;
    else
        continue;
    i++;
    if (i > chosenAnagram.length())
        break;
}
for (int l = 0; l < chosenAnagram.length(); l++) {
    System.out.println(splitAnagram[presetNumbers[l]]);
}

По сути, он генерирует случайные числа для каждой буквы, так что он "скремблирует" слово. Он ошибочен как есть, потому что он еще даже не должен зацикливаться, просто сделать одну схватку, но в целом он кажется очень медленным и подверженным ошибкам (я сплю на 10 мс, потому что он может делать случайные числа только при каждом изменении системного времени ).

Мне интересно, есть ли какой-нибудь другой алгоритм для этого или возможный API, который я мог бы использовать. Спасибо!

P.S. Я использую Eclipse Photon, на случай, если вам известен плагин для этого.

1 Ответ

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

Я нашел способ сделать это с Fisher - Yates Shuffle , из этого сообщения Stackoverflow. Вот как получился код:

@SuppressWarnings("unchecked")
private void beginDecoding(String chosenAnagram) throws InterruptedException {
    Random random = new Random();
    List madeAnagrams = new ArrayList();
    int factorial = 1;
    for (int i = chosenAnagram.length(); i > 0; i--) {
        factorial = i * factorial;
    }
    System.out.println(factorial);
    while (true) {
        if (madeAnagrams.size() == factorial) {
            break;
        }
        TimeUnit.MILLISECONDS.sleep(10);
        char[] splitAnagram = chosenAnagram.toCharArray();
        for (int i = chosenAnagram.length() - 1; i > 0; i--) {
            int index = random.nextInt(i + 1);
            char letter = splitAnagram[index];
            splitAnagram[index] = splitAnagram[i];
            splitAnagram[i] = letter;
        }
        String returnAnagram = new String(splitAnagram);
        if (!madeAnagrams.contains(returnAnagram)) {
            madeAnagrams.add(returnAnagram);
            System.out.println(returnAnagram);
        }
        else
            continue;
    }
}
...