Nowe posty

xx Problem ze sterownikami. (5)
2024-04-13, 21:25:16
xx Instalacja xfce4 (2)
2024-04-13, 16:20:17
xx Serie kompilacji bez instalacji dla “emerge” w Gentoo (2)
2024-04-08, 18:40:04
xx Plasma 6 w Neonie ssie trochę mniej ... (17)
2024-04-05, 10:03:46
xx Problem z Linux Lite po instalacji (3)
2024-04-03, 14:23:40
xx Jak właczyć num locka przy starcie systemu debian 12? (12)
2024-04-02, 17:43:54
xx Brak dźwieku w systemie. (5)
2024-04-02, 16:13:41
xx Dystrybucja pod HP Omen (7)
2024-03-29, 11:33:05
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
xx Ile pingwinów? (1)
2024-03-27, 08:59:24

Autor Wątek: Permutacje znaków  (Przeczytany 9004 razy)

axlinux

  • Gość
Permutacje znaków
« dnia: 2009-03-02, 16:01:36 »
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ę :(

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Permutacje znaków
« Odpowiedź #1 dnia: 2009-03-02, 17:52:05 »
Proponuję funkcję rekurencyjną.

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

#include < QString>
#include < QStringList>

void perm( QStringList *list, QString chars, QString begin="" )
{
if( chars.length() <= 1 )
{
list->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 );
// ...
}

ZipoKing

  • Gość
Permutacje znaków
« Odpowiedź #2 dnia: 2009-03-02, 18:23:13 »
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

  • Gość
Permutacje znaków
« Odpowiedź #3 dnia: 2009-03-03, 09:32:52 »
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() <= 1 )  powinno być  if( chars.length() == 0 ) bo generuje po dwa takie same permutacje

public static void main(String[] args)
    {
       ArrayList lista = new ArrayList();
       perm(lista, "abcd", "");

    }

    public static void perm(ArrayList lista, String znaki, String begin)
    {
        if(znaki.length() == 0)
        {
            lista.add(begin + znaki);
            System.out.println(begin + znaki);
        }

        for(int k=0 ; k < znaki.length() ; k++)
        {
            String znaki2 = znaki.substring(0, k) + znaki.substring(k+1, znaki.length());
            perm(lista, znaki2, begin+znaki.charAt(k));
        }
    }

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Permutacje znaków
« Odpowiedź #4 dnia: 2009-03-03, 12:35:02 »
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.