Programowanie > Java

Permutacje znaków

(1/1)

axlinux:
Witam

Muszę napisać w Javie funkcję, która zwróci wszystkie permutacje wprowadzonych znaków.

np. wprowadzam znaki: abcd a funkcja w tablicy zwraca np.

abcd, abdc, acdb, cdba itp...

Trochę się już z tym męczę :(

ultr:
Proponuję funkcję rekurencyjną.

Javy nie lubię i dawno nie używałem, więc napiszę w Qt. Logika jest jedna.


--- Kod: ---
#include < QString>
#include < QStringList>

void perm( QStringList *list, QString chars, QString begin="" )
{
if( chars.length() push_back( begin+chars );
printf( "%s\\n", (begin+chars).toUtf8().data() ); //
return;
}
for( int k=0; k < chars.length(); k++ )
{
QString chars2 = chars;
chars2.remove( k, 1 );
perm( list, chars2, begin+chars.at(k) );
}
}

int main()
{
QStringList list;
QString chars = "abcd";
perm( &list, chars );
// ...
}
--- Koniec kodu ---

ZipoKing:
Kiedyś napisałem swojemu znajomemu coś podobnego w C i po paru przeróbkach + przetłumaczeniu na Jave powinno działać ;) : http://zipoking.wordpress.com/2008/01/27/kombinator/

axlinux:
Dzięki wielkie za posty i za kod.

Sprawdziłem najpierw kod od ULTR-a. Przepisanie tego do Javy oczywiście nie sprawiło kłopotu, jednak wg mnie zamiast:

if( chars.length()

ultr:
Dokładnie to powinno być if( chars.length() == 1 ).

Wpisując zero też działa, ale wykonuje jedno niepotrzebne wywołanie funkcji z begin równym całej permutacji i chars="". Kwestia wyboru.

Jeśli używasz 0, to logicznie byłoby napisać dalej:
if(znaki.length() == 0)
{
  lista.add(begin);
  System.out.println(begin);
  return;
}


EDIT: Nie zauważyłem błędu w poprzednim kodzie. W if-ie powinien być return. To dlatego były powtórzone wyniki.

Nawigacja

[0] Indeks wiadomości

Idź do wersji pełnej