2013-01-08 12 views
6

Próbuję móc porównać dwa ciągi znaków i zidentyfikować zduplikowane słowa. Na przykład;Porównywanie dwóch ciągów znaków w języku Java i identyfikowanie duplikatów słów

String1 = "Hello, my name is John." 
String2 = "Can you tell me your name please?" 

Porównanie wartości String1 i String2 spowoduje zwrócenie słowa; "Nazwa".

Wiem, że możliwe jest podzielenie tych dwóch ciągów na tablicę słów, a następnie iterowanie po każdym słowie każdego ciągu w tablicy 2-D. Jest to jednak kosztowne obliczeniowo w O (n^2) i zastanawiałem się, czy istnieje szybszy sposób robienia tego?

Dzięki.

EDYCJA: Zmieniono przykład w celu zwiększenia czytelności.

+0

Czy chcesz także usunąć interpunkcję? – fge

+0

@fge Przepraszamy, nie udało się zauważyć, że przykład nie zadziałałby. Zmieniłem to teraz. –

Odpowiedz

12

Po zdobyciu struny do tablic słowo:

Możesz dodać wszystkie elementy w pierwszej tablicy do HashMap, a następnie zeskanować drugą tablicę aby sprawdzić, czy każdy z elementów istnieje w hashmap. Ponieważ czas dostępu do mapy mieszającej wynosi O (1), będzie to złożoność czasu O (n + m).

Jeśli nie chcesz używać dodatkowej spacji, możesz sortować obie tablice w O (nlogn), a następnie porównać elementy w O (n + m), co da w sumie O (nlogn).

+0

Dobra, dam ci to i zgłoś się. Dzięki –

+0

Rozwiązanie hashmap jest prawdopodobnie najlepsze, pamiętaj tylko, że różnica prędkości może być znacznie ważniejsza w przypadku dłuższych tekstów. – bjedrzejewski

+0

@ jedrus07 Tak, to absolutnie słuszne, chciałem tylko przedstawić inną opcję lepiej niż O (n^2) –

6

Jednym prostym rozwiązaniem jest użycie metody Guawy Sets. To jest dość proste:

String s1 = "Hello, my name is John."; 
String s2 = "Can you tell me your name?"; 
Splitter splitter = Splitter.onPattern("\\W").trimResults().omitEmptyStrings(); 
Set<String> intersection = Sets.intersection(// 
     Sets.newHashSet(splitter.split(s1)), // 
     Sets.newHashSet(splitter.split(s2))); 
System.out.println(intersection); 

wyjściowa:

[name] 

Można również znaleźć więcej informacji na temat algorytmów wykrywania zestaw skrzyżowanie na this thread.

+0

Czy obiekt Splitter powinien być StringSplitter? Splitter nie jest rozpoznawany. –

+0

To jest 'com.google.common.base.Splitter' – Alex

+0

BTW Używam do tego' Guava 13.0.1'. – Alex

Powiązane problemy