2016-01-06 6 views
0

Я хочу создать программу, которая бы не распутывала несколько слов.
Мне нужно попробовать все возможные комбинации слов, которые могут быть сформированы, а затем проверить, содержится ли он в переменной String с именем dict.Java: Неизвестное число циклов 'for'

Мой код:

public class UnJumble 
{ 
    public static void main(String args[]) 
    { 
     String dict = "cat, rat, mat dog, let, den, pen, tag, art,"; 

     String t = "tra"; 
     int l = t.length(); 
     for(int i=0; i<l; i++) 
     { 
       char a=t.charAt(i); 
       t = t.replaceFirst(a+"",""); 
       l--; 
       for(int j=0; j<l; j++) 
       { 
        char b = t.charAt(j); 
        t = t.replaceFirst(b+"",""); 
        l--; 
        for(int k=0; k<l; k++) 
        { 
          char c = t.charAt(k); 
          if(dict.contains(""+a+b+c+",")) 
          { 
           System.out.println("\'"+a+b+c+"\' found."); 
           break; 
          } 
        } 
        l++; 
        t = new StringBuilder(t).insert(j,b+"").toString(); 
       } 
       t = new StringBuilder(t).insert(i,a+"").toString(); 
       l++; 
     } 
    } 
} 

t переменная содержит слово, чтобы быть не-перемешано.

С помощью этого кода, выход:
'rat' found.
'art' found.

Я думаю, что мне нужно так много for петли, как там символы в строке t.

Но я хочу, чтобы он мог размахивать словами неизвестной длины. Итак, как я могу это достичь?

Я пробовал поиск в Интернете и на SO. Я нашел ответы на SO, которые написаны на других языках программирования, которые я не понимаю.

+3

Ищите рекурсивные методы;) –

+0

Первый цикл с наименьшим из двух: сочетания максимальных слов, которые могут быть сделаны, т.е. n букв могут вызывать определенное количество комбинаций (комбинаторы поиска для вычисления) или количество словарных слов (в зависимости от того, что меньше). –

+2

Вы просто хотите переставить 't'. См. http://stackoverflow.com/questions/4240080/generating-all-permutations-of-a-given-string – dejvuth

ответ

0

Вы должны искать рекурсивные методы.

Например, если строка str из n символов, вы можете написать функцию, которая basicaly это сделать:

List<String> compute(String str) 
    // TODO : Handle case where str has only 1 character 
    List<String> list = compute(str.substring(0,n-2)) 
    // TODO : Compute all combinations of str[n-1] with list 
    return list; 

Я предполагаю, что это может быть улучшено много в некоторых случаях.

+0

Я искал в Интернете рекурсивные методы, но не могу думать о том, как это можно реализовать здесь. – Hackerdarshi

0

Существует сложный способ сделать это без цикла for для каждой буквы в переменной t, но это требует кода. Вы можете настроить цикл, который рассчитывается в базе n, где n - длина t. Предположим, что я - ваш счетчик: каждый проходит через этот цикл, вы используете отдельные цифры в i как индексы в t, затем создавайте «слово» и проверяете это слово на ваш словарь. Вы используете два разных способа: как счетчик и как набор цифр, которые представляют индексы в ваш т.

Например, если ваш т имеет три буквы, то вы хотите подсчитать в базе 3 следующим образом: 012, 020, 021, 022, 100, 101, 110,111 и так далее. Теперь логике нужно убедиться, что ваша комбинация цифр уникальна, поэтому вы не используете букву дважды, когда вы строите слово.

Очень много работы, но алгоритм правильный. Преимущество в том, что оно работает для строк любой длины.

Я знаю, что меня отклонят, но, о, хорошо.

Смежные вопросы