Frage

Lassen Sie uns sagen, ich habe ein paar Worte AB, AAB, AA.

AB ist kein Präfix AAB aber AA ist ein Präfix zu AAB, denn wenn ich nur B am Ende der AA hinzuzufügen AAB werden wird, die mit AB nicht möglich ist.

So ist es eine Funktion in C ++ (STL), so dass ich von zwei Wörtern feststellen kann, ob ein Präfix zum anderen ist?

Danke.

War es hilfreich?

Lösung

template<class C, class T, class A>
bool starts_with(std::basic_string<C,T,A> const& haystack,
                 std::basic_string<C,T,A> const& needle)
{
  return needle.length() <= haystack.length() &&
    std::equal(needle.begin(), needle.end(), haystack.begin());
}

Beachten Sie, dass die Längenprüfung nicht vorzeitige Optimierung ist, es zu treffen std :: erforderlich ist gleich die Voraussetzung.

Andere Tipps

std::string full = "AAB", pre= "AA";
bool prefixed = full.find( pre ) == 0;

oder was ist:

bool prefixed =  full.compare( 0, pre.size(), pre ) == 0;
std::string full = "AAB", lookfor = "AA";
const bool isprefixmatch = (full.substr(0,lookfor.lenght())==lookfor);

Diese Antwort arbeitet mit C und C ++ und nicht STL benötigen.

// test if string2 a prefix of string1
// inputs must be non NULL
// returns TRUE if string2 is a prefix, otherwise FALSE

int isAPrefix(const char *string1,
              const char *string2)
{
    return (strncmp(string1, string2, strlen(string2)) == 0);
}

Wenn Sie bereits abhängig sind auf Boost, gibt es boost::algorithm::starts_with .

int main()
{
    std::cout << boost::algorithm::starts_with("abba", "ab"); // true
    std::cout << boost::algorithm::starts_with("abba", "ba"); // false
    return 0;
}

Wenn Sie std::string zu finden, ist ein String-Manipulation Methode fehlt Sie benötigen, besuchen Sie das Boost-String Algorithms Bibliothek.

Verwenden Sie die find Methode einer Zeichenkette. Überprüfen Sie, ob der Index kehrt am Anfang der Zeichenfolge ist.

http://www.cplusplus.com/reference/string/string/ ist ein guter Ort, um über für Sachen wie diese. Nehmen Sie 10 Minuten, um sich mit diesen Funktionen, weil die meisten von ihnen sehr nützlich sind.

Hier finden Sie verwenden den Text überall in der anderen Zeichenfolge zu finden, aber find_first_of könnte besser geeignet sein (und vergleichen, gegen das Suffix). Ansonsten das Suffix zu finden, würde find_last_of angemessen sein.

Die wirkliche Antwort auf Ihr Problem, ich denke, wird mit einem Präfix-Baum. Der akzeptierte Antworten Algorithmus wird die Arbeit tun, aber Sie müssten Ihr Präfix-wouldbe Wort in Ihrem Wortmenge zu jedem anderen überprüfen, die linear in der Zeit. Tun Sie das, für alle die Wörter (sagen, Sie wollen alle die Worte zu bekommen, die Präfixe anderen Worten sind), und Sie haben O (n ^ 2) Komplexität an den Händen. Die einfache Prüfung, ob ein Wort ein Präfix zum anderen ist linear auf die Länge des Wortes.

ein Präfix-Baum verwendet, wird Ihre erste Frage in logarithmischer Zeit und die zweite Antwort - in linear. Prüfen, ob ein Wort ein Präfix ist nur ein Spaziergang von der Wurzel bis Sie das Wort in dem Baum finden und der letzte Knoten kein Blatt (eine längere Wortbedeutung erstreckt vorhanden) - durch die Höhe des Baumes begrenzt. Durchlaufen des Baums, auf der anderen Seite, und Schreiben des aktuellen Wortes auf jedem Schritt nach unten, für die der letzte Knoten kein Blatt ist, würde eine Liste aller Wörter prefix ergeben. Der Baumdurchlauf wird in linearer Zeit getan, wie Sie jeden Knoten besuchen werden nur einmal.

Wenn Sie nur eine Zeichenfolge finden oder Teilzeichenfolge ist Präfix von anderen als u einfach diese fn verwenden

 std::size_t found = str1.find(str2); //returns position of str2 in str1 (if found==0) than it is prefix else not.

Wenn es nicht existiert, als es gibt einen Müll Wert und wenn U tut das gleiche für eine Nr. von Strings und wollen Sie in schnelle Weise zu tun haben TRIE zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top