优雅的方式进行字符串前缀测试

时间:2016-03-06 13:10:43

标签: c++ string c++14 c++-standard-library

据我所知,标准库中没有直接执行此操作的工具。所以,我想知道一种简单而优雅的方法。请注意,我不打算自己编写is_prefix()函数。只需使用标准库中已有的内容即可。假设任务是测试ab的前缀(两者都是std::string类型)。

最简洁的方式似乎是b.find(a) == 0。但这需要O(a.size() * b.size())时间。不好。

另外,我们可以b.substr(0, a.size()) == a。这需要线性时间。但它会创建一个新的字符串对象,这可能涉及堆上的动态内存分配。所以,没有好处。

我们可以写b.size() >= a.size() && std::equal(b.begin(), b.begin() + a.size(), a.begin())。这在运行时性能方面是最佳的,但代码很长。

有什么建议吗?

对于那些想知道我为什么这样问的人,我想找到一个方便的解决方案,用于TopCoder SRM和求职面试。

2 个答案:

答案 0 :(得分:5)

您可以使用std::mismatch算法:

bool is_prefix(const std::string& data, const std::string& prefix)
{
    auto mismatch = std::mismatch(data.begin(),   data.end(),
                                  prefix.begin(), prefix.end()).second;
    return mismatch == prefix.end();
}

答案 1 :(得分:0)

对于使用旧版Visual Studio版本的人:

由于str必须至少与前缀一样长,我们可以使用3参数版本,不再需要更新的c ++标准。

std::mismatch(prefix.begin(), prefix.end(), str.begin()).first == prefix.end();