3

AB、AAB、AAという言葉があるとしましょう。

AB は AAB のプレフィックスではありませんが、AA は AAB のプレフィックスです。なぜなら、AA の末尾に B を追加すると、AB では不可能な AAB になるからです。

では、c++ (STL) には関数があり、2 つの単語が別の単語のプレフィックスであるかどうかを判断できますか?

ありがとう。

4

9 に答える 9

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

長さチェックは時期尚早の最適化ではないことに注意してください。std::equalの前提条件を満たす必要があります。

于 2010-03-20T10:57:59.283 に答える
5
std::string full = "AAB", pre= "AA";
bool prefixed = full.find( pre ) == 0;

またはどうですか:

bool prefixed =  full.compare( 0, pre.size(), pre ) == 0;
于 2010-03-20T10:55:20.200 に答える
3
std::string full = "AAB", lookfor = "AA";
const bool isprefixmatch = (full.substr(0,lookfor.lenght())==lookfor);
于 2010-03-20T10:53:06.963 に答える
2

すでに Boost に依存している場合は、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;
}

std::string必要な文字列操作メソッドが不足している場合は、Boost String Algorithms ライブラリを確認してください

于 2010-03-20T16:21:34.780 に答える
2

この回答は C および C++ で機能し、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);
}
于 2010-03-20T11:36:33.667 に答える
1

find文字列のメソッドを使用します。返されるインデックスが文字列の先頭にあるかどうかを確認します。

于 2010-03-20T10:53:15.700 に答える
1

http://www.cplusplus.com/reference/string/string/は、このようなものを探すのに適した場所です。これらの機能のほとんどは非常に便利なので、これらの機能に慣れるために10分かかります。

findを使用して、他の文字列の任意の場所でテキストを検索できますが、find_first_ofの方が適切な場合があります(接尾辞と比較してください)。それ以外の場合、接尾辞を見つけるには、find_last_ofが適切です。

于 2010-03-20T10:57:21.740 に答える
0

あなたの問題に対する本当の答えは、プレフィックスツリーを使用することだと思います。受け入れられた回答アルゴリズムは仕事をしますが、プレフィックスをチェックする必要があります-時間的に線形である単語セット内の他のすべての単語になります。すべての単語に対してこれを行うと (たとえば、他の単語の接頭辞であるすべての単語を取得したいとします)、手に O(n^2) の複雑さがあります。単語が別の単語の接頭辞であるかどうかの単純なチェックは、単語の長さに比例します。

プレフィックス ツリーを使用すると、最初の質問は対数時間で、2 番目の質問は線形で答えられます。単語が接頭辞であるかどうかを確認するには、ツリー内でその単語が見つかり、最後のノードが葉ではなく (存在するより長い単語が存在することを意味します)、ツリーの高さによって制限されるまで、ルートから上に下ります。一方、ツリーをトラバースし、最後のノードが葉ではない各ステップで現在の単語を書き留めると、すべての接頭語のリストが生成されます。各ノードに 1 回だけアクセスするため、ツリー トラバーサルは線形時間で実行されます。

于 2010-03-20T11:30:12.163 に答える
0

1 つの文字列または部分文字列が u 以外の接頭辞であることがわかった場合は、単にこの fn を使用できます

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

存在しない場合はガベージ値を返し、If U は no に対して同じことを行います。文字列をすばやく処理したい場合は、TRIE を使用する必要があります。

于 2018-03-18T21:00:18.753 に答える