2016-06-16 9 views
0

Ich habe eine Aufgabe zu tun, und ich habe darüber nachgedacht, aber ich komme nicht mit der richtigen Antwort.Vergleichen Sie zwei Arrays und geben Sie den Index der ersten Erscheinung

Schreiben Sie in einer Sprache Ihrer Wahl eine Funktion, die eine Zeichenfolge mit dem Namen str und eine Zeichenfolge mit dem Namen set erhält.

Die Funktion gibt den Index des ersten Auftretens eines beliebigen Zeichens aus set in str zurück.

Zum Beispiel: str = "hallohellohellohelloistom!" set = "t98765!"

Die Funktion gibt 22 (Index von '5' in str) zurück. Stellen Sie sicher, dass die Zeitkomplexität nicht größer ist als die Länge der beiden Zeichenfolgen. O (m + n) Angenommen, die Zeichenfolge enthält nur ASCII-Zeichen.

Ich habe darüber nachgedacht und ich dachte darüber nach, es mit Teile und Herr zu machen. Ich habe einen Basisfall, der immer O (1) ist und das Ich teile das Problem in kleinere Probleme, bis ich die Antwort bekomme. Das Problem ist, dass bei dieser Lösung die Komplexität O (log n) ist.

Der andere Ansatz, den ich dachte, war, ein Set zu machen. Aber ich weiß immer noch nicht wirklich, wie ich dieses Problem angehen soll. Irgendwelche Ideen??

Antwort

1

Da alle beteiligten Zeichenfolgen nur ASCII-Zeichen enthalten, kann diese unter Verwendung von constant memory in O(LengthOf(str) + LengthOf(set)) gelöst werden.

Hier ist der Code in "C" Sprache:

//ReturnValues: 
//-1 : if no occurrence of any character of set is found in str 
//value >=0 : index of character in str. 
int FindFirstOccurenceOfAnyCharacterInSet(const char *str, const char *set, int *index_of_set) 
{ 
    char hash[256]; 
    int i = 0; 
    while(i < 256) 
    { 
     hash[i] = -1; 
     ++i; 
    } 
    i = 0; 
    while(set[i] != '\0')  
    { 
     hash[set[i]] = i; 
     ++i; 
    } 
    i = 0; 
    while(str[i] != '\0') 
    { 
     if(hash[str[i]] != -1) 
     { 
      *index_of_set = hash[str[i]]; 
      return i; 
     } 
     ++i; 
    } 
    *index_of_set = -1; 
    return -1; 
} 

Logic arbeitet, indem sie die Position/Indizes der Aufnahme (die> = 0) alle Zeichen von set in hash Tabelle und dann str Parsen und Überprüfen, ob das aktuelle Zeichen str in hash Tabelle vorhanden ist.

index_of_set wird auch den Index des Zeichens in set, die in str gefunden wird. Wenn index_of_set = -1 dann wurde kein Vorkommen gefunden.

+0

Das war der Schlüssel !! Vielen Dank! – SomeAnonymousPerson

+0

'hash' Tabelle ist mit' -1' gefüllt, weil wir versuchen, die 'indexes' in der Tabelle zu speichern und alle gültigen Indizes sind immer'> = 0'. Wenn wir also prüfen wollen, ob in der Tabelle 'str [i]' vorhanden ist, können wir direkt zur Position springen (eine Position, deren Wert str [i] ist) in der Tabelle und wenn der Wert an dieser Stelle '-1' ist Dann wird angegeben, dass an dieser Stelle kein Index/Zeichen von 'set' gespeichert ist. – sameerkn

+0

Ich habe es, aber dann in der Sekunde, während ich es mit -1 vergleichen wollte, nein mit 0? Wenn ich es mit 0 vergleiche, wird es fortgesetzt, auch wenn die Menge nicht so lang ist. – SomeAnonymousPerson

2

Dieses Programm in Swift

geschrieben
let str = "hellohellohellohelloistom!" 
let set = "t98765!" 

func findFirstAppearance(str : String , set : String) -> Int? { 
    var index : Int? 

mainLoop: for setCharacter in set.characters{ 

    for (indexOfChar,strCharacter) in str.characters.enumerate(){ 

     if strCharacter == setCharacter{ 
     index = indexOfChar 
      break mainLoop 
     } 
    } 

} 

return index 
} 

print(findFirstAppearance(str, set: set)) 
print(findFirstAppearance("helloWorld", set: "546Wo")) 

oder eine andere Lösung mit weniger zeitraubend

let str = "hellohellohellohelloistom!" 
let set = "t98765!" 

func findFirstAppearance(str : String , set : String) -> Int? { 
    var index : Int? 

    mainLoop: for setCharacter in set.characters{ 

     if let range = str.rangeOfString(String(setCharacter)){ 

      index = str.startIndex.distanceTo(range.startIndex) 

      break 
     } 

    } 

    return index 
} 

print(findFirstAppearance(str, set: set)) 
print(findFirstAppearance("helloWorld", set: "546Wo")) 

Hinweis:

  1. wenn irgendein Zeichen, das nicht gefunden wird, dann wird es Fehlanzeige
  2. ist es Groß-und Kleinschreibung Vergleich

Hoffe, dass dies Ihr Problem lösen wird.

+0

Aber in der Antwort, die Sie Sie markieren verwenden zwei for-Schleifen. Das heißt, die Komplexität der Lösung ist O (n2) oder Im worng? – SomeAnonymousPerson

+0

Ja, es verwendet zwei for-Schleifen zum Vergleich. –

+0

Genau, das ist das Problem. Ich brauche die Komplexität, um O (m + n) zu sein. Das ist das Problem. Irgendwelche Ideen? Vielen Dank! – SomeAnonymousPerson

0

Danke für die Hilfe !!

Hier ist auch der Code in C#.

Cheers,

public static int FindFirstOccurenceOfAnyCharacterInSet(string str, string set) 
    { 
     var hash = new int[256]; 
     int i = 0; 
     while (i < 256) 
     { 
      hash[i] = -1; 
      ++i; 
     } 
     i = 0; 
     do 
     { 
      hash[set[i]] = i; 
      ++i; 
     } while (set[i] != '\0' && i < set.Length - 1); 
     i = 0; 
     while (str[i] != '\0') 
     { 
      if (hash[str[i]] != -1) 
      { 
       return i; 
      } 
      ++i; 
     } 
     return -1; 
    } 
+0

Schön, aber ich denke nicht, es ist die perfekte Antwort, weil es drei Schleifen zum Überprüfen und auch komplexer verwendet :) –

+0

Ich werde es perfekt machen und hier bearbeitet. Ich habe deine Antwort noch einmal überprüft, und die zweite könnte auch gut sein. Das Problem mit der ersten Antwort war, dass die Komplexität nicht O (n + m) war, da Sie zwei für Looks (ineinander) verwendeten. [link] (http://stackoverflow.com/a/27301734/4300137) Überprüfen Sie diese Antwort, ich habe es sehr gut verstanden! Vielen Dank!! – SomeAnonymousPerson

Verwandte Themen