假设我有一些单词AB,AAB,AA。
AB不是AAB的前缀,但AA是AAB的前缀,因为如果我只是在AA的末尾添加B,它将成为AAB,这对于AB是不可能的。
那么,c ++(STL)中是否有任何函数可以确定两个单词是否为另一个单词的前缀?
感谢。
答案 0 :(得分: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的前提条件。
答案 1 :(得分:4)
std::string full = "AAB", pre= "AA";
bool prefixed = full.find( pre ) == 0;
或者说:
bool prefixed = full.compare( 0, pre.size(), pre ) == 0;
答案 2 :(得分:3)
std::string full = "AAB", lookfor = "AA";
const bool isprefixmatch = (full.substr(0,lookfor.lenght())==lookfor);
答案 3 :(得分: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);
}
答案 4 :(得分: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库。
答案 5 :(得分:1)
使用字符串的find
方法。检查它返回的索引是否在字符串的开头。
答案 6 :(得分:1)
http://www.cplusplus.com/reference/string/string/是一个很好的地方,可以查看这样的内容。花10分钟熟悉这些功能,因为大多数功能非常有用。
您可以使用find在其他字符串中的任何位置查找文本,但find_first_of可能更合适(并与后缀进行比较)。否则,为了找到后缀,find_last_of将是合适的。
答案 7 :(得分:0)
我认为,问题的真正答案是使用前缀树。接受的答案算法将完成这项工作,但你必须检查你的单词集中的所有其他单词的前缀 - 单词是否是线性的。对所有单词都这样做(假设你想要获得所有其他单词前缀的单词)并且你手上有O(n ^ 2)的复杂性。 简单检查一个单词是否是另一个单词的前缀在单词的长度上是线性的。
使用前缀树将以对数时间回答您的第一个问题,第二个问题将以线性方式回答。检查一个单词是否是一个前缀只是从根向下漫步,直到你在树中找到单词并且最后一个节点不是一个叶子(意味着延伸它的更长的单词存在) - 受到树高的限制。另一方面,遍历树,并在最后一个节点不是叶子的每一步上写下当前单词将产生所有前缀单词的列表。树遍历是在线性时间内完成的,因为您只访问每个节点一次。
答案 8 :(得分:0)
如果你发现一个字符串或子字符串是除了你以外的前缀,可以简单地使用这个fn
Gato[] gato = new Gato[] {
new Gato(true, "Siames", "Fluffy", 10),
new Gato(false, "Persa", "Fluffy", 11),
...
};
如果它不存在,则返回垃圾值 如果你做了相同的没有。在快速的方式中,你必须使用TRIE。