2016-04-28 23 views
-1

Ich möchte einen Code schreiben, der Zeichenfolgen mit Zeichen in anderer Reihenfolge als gleich annimmt, solange dieselben Zeichen in den Zeichenfolgen platziert werden. Nehmen wir zum Beispiel $ a = "ksv" an, wenn jemand den String-Wert "svk" oder "kvs" eingibt, möchte ich einen Code schreiben, der diesen Strings äquivalent zu $ ​​a ist. Hier ist ein Beispiel,Reihenfolge der Zeichen der Zeichenfolge in Perl

@ans=("ksv", "kvs", "svk", "vsk",......); 

if (@input[1] ~~ @ans) { 
      return 'EXACT_ANS'; 
} 

@input [1] ist, welcher Benutzer die Zeichenfolge setzen. Zuerst habe ich alle verschiedenen Ordnertypen als Array aufgelistet (genau wie im Beispiel), so dass, wenn eines der Elemente im Array mit @input [1] übereinstimmt, ich es als korrekte Antwort zurückgebe. Dies ist jedoch eine ziemlich lange und mühsame Arbeit, wenn ich eine Saite mit viel längerer Länge habe. Bitte geben Sie mir einen Hinweis dazu. Danke ^^

+0

Müssen die Längen der beiden Saiten gleich sein? Mit anderen Worten, sollte 'svksvk' auch übereinstimmen? – ThisSuitIsBlackNot

+0

Da Perl Sie warnt, ist '@input [1]' eine nicht standardisierte Art, '$ input [1]' zu schreiben. – ikegami

+0

Bitte verwenden Sie nicht smart match. '$ input [1] ~~ @ ans' ist ein experimentelles Feature, das in späteren Versionen der Sprache geändert oder entfernt werden kann. Die beste Alternative ist 'List :: Util :: first' – Borodin

Antwort

0

Sie wollen etwas von der Form

if (normalize_string($input) eq normalize_string('ksv')) { 
    ... 
} 

wo normalize_string ein Unter ist, die die gleiche Zeichenfolge für alle gleichwertigen Eingänge zurückgibt, und gibt verschiedene Saiten für Eingänge, die nicht gleichwertig sind.


Die genaue Definition von normalize_string variieren je nachdem, was Sie gleichwertig betrachten.

Wenn Sie doppelte Zeichen ignoriert werden sollen (abbc-abc entspricht):

sub normalize_string { 
    my %h; 
    ++$h{$_} for split //, $_[0]; 
    return join '', sort keys %h; 
} 

Wenn die Anzahl der Instanzen jedes Zeichens relevant ist (abbc ist nicht gleichbedeutend mit abc):

sub normalize_string { 
    return join '', sort split //, $_[0]; 
} 

Natürlich können Sie die normalisierte Form inline, wenn der Parameter eine Konstante ist.

Verwandte Themen