2016-08-05 44 views
8

Biorąc pod uwagę, że 2 ciągi:Znajdź czy każda postać w 1 ciąg jest istnieć w innym ciągiem, szybciej niż O (n^2)

String stringA = "WHATSUP"; 
String stringB = "HATS"; 

Chcę dowiedzieć się, czy każdy znak w stringB HATS istnieje w podejściu młodszym, proces można wykonać w zagnieżdżonej pętli for, której złożoność obliczeniowa wynosi O (n^2).

for(int i = 0; i < stringA.length(); i++){ 
    for(int j = 0; j < stringB.length(); j++){ 
     if(stringA.charAt(i) == stringB.charAt(j)) 
      //do something 
    } 
} 

Szukam szybszego rozwiązania, aby rozwiązać ten problem.

+0

To wygląda na zadanie domowe; ale możesz po prostu utworzyć hasz dla obu łańcuchów i użyć 'containsAll' – NullUserException

Odpowiedz

10

Istnieje algorytm liniowy czasu.

  1. konwertować stringA do hash-zestaw znaków, który ma O (1) testowanie członkowskiej.
  2. Powtórz poszczególne znaki w stringB.
  3. Jeśli jeden z tych znaków nie znajduje się w twoim haszymdzie, test kończy się niepowodzeniem.
  4. Jeśli nie ma niepowodzenia, test się powiódł.
+0

Jeśli' stringA' jest znacznie dłuższy niż 'stringB,' czy konwersja nie spowolniłaby procesu w dłuższej perspektywie? – Nerdizzle

+0

@Nerdizzle: Tak, w przypadku niektórych przypadków wolniejsze jest stosowanie tego podejścia. – recursive

+0

Nie możesz po prostu utworzyć dwóch mieszańców i użyć 'containsAll()'? – NullUserException