Pergunta

Digamos que eu tenha algumas palavras ab, aab, aa.

O AB não é um prefixo do AAB, mas AA é um prefixo da AAB, porque se eu apenas adicionar B no final do AA, ele se tornará AAB, o que não é possível com AB.

Então, existe alguma função em C ++ (STL) para que eu possa determinar duas palavras se um for prefixo para o outro?

Obrigado.

Foi útil?

Solução

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());
}

Observe que a verificação de comprimento não é a otimização prematura, é necessário atender à pré -condição da STD :: Equal.

Outras dicas

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

ou que tal:

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

Esta resposta funciona com C e C ++ e não requer STL.

// 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);
}

Se você já depende do impulso, há 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;
}

Sempre que você encontrar std::string está sem um método de manipulação de cordas que você precisa, confira o Aumente os algoritmos de string biblioteca.

Use o find método de uma string. Verifique se o índice retorna está no início da string.

http://www.cplusplus.com/reference/string/string/ é um bom lugar para procurar coisas como essa. Reserve 10 minutos para se familiarizar com essas funções, porque a maioria delas é muito útil.

Você pode usar o Find para encontrar o texto em qualquer lugar da outra string, mas o find_first_of pode ser mais apropriado (e comparar com o sufixo). Caso contrário, para encontrar o sufixo, find_last_of seria apropriado.

A resposta real para o seu problema, eu acho, está usando uma árvore de prefixo. O algoritmo de respostas aceitas fará o trabalho, mas você teria que verificar sua palavra prefixo-para todas as outras palavras que são lineares no tempo. Faça isso por todas as palavras (diga que você quer obter todas as palavras que são prefixos para outras palavras) e você tem complexidade O (n^2) em suas mãos. A verificação simples se uma palavra é um prefixo para outro é linear sobre o comprimento da palavra.

O uso de uma árvore de prefixo responderá sua primeira pergunta no tempo logarítmico e a segunda - em linear. Verificar se uma palavra é um prefixo é apenas um passeio descendo da raiz até você encontrar a palavra na árvore e o último nó não é uma folha (o que significa que uma palavra mais longa que ela existe) - limitada pela altura da árvore. Atravessar a árvore, por outro lado, e escrever a palavra atual em cada etapa para a qual o último nó não é uma folha produziria uma lista de todas as palavras prefixos. A travessia da árvore é feita em tempo linear, pois você visitará cada nó apenas uma vez.

Se você apenas descobrir uma corda ou substring é prefixo de outra coisa que você pode simplesmente usar este FN

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

Se não existir, retorna um valor de lixo e se você está fazendo o mesmo para um não. de cordas e quero fazer de maneira rápida, você tem que usar o Trie.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top