首页 > 解决方案 > 检查一个字符是否在字符串中至少出现 N 次。算法中的任何解决方案?

问题描述

这个问题在获得解决方案方面并不难,但我想知道是否有任何 C++ 函数或算法可以解决它。

我在处理这个问题时想到了这个问题Count character occurrences in a string in C++

所以想知道除了从头开始编写一个函数来检查字符串中是否存在特定数量的字符之外,我们是否还有其他选择。例如让我们说:

std::string s = "a_b_c_d_e_f_g_h_i_j_k_l_m";

我们想找出字符串中是否至少有 2 个 '_'。如果我们使用std::count它将返回所有 '_' 的计数。std::count_if也会以类似的方式表现。我可以编写一个代码来循环遍历字符串并在计数达到 2 时立即中断,但我想知道我们是否在 C++ 算法或函数中有一些现有的解决方案。

这里的思考过程是,如果我们得到一个很长的字符串作为输入,并且做某事的标准是基于特定字符是否至少出现 n 次,那么遍历整个字符串是一种浪费。

标签: c++stringalgorithmstl

解决方案


std::find_if使用适当的函子就可以完成这项工作:

std::string s1 = "a_b_c_d_e_f_g_h_i_j_k_l_m";
int count = 0;
bool found =
    std::find_if(s1.begin(), s1.end(),
        [&count] (char c) {
           return c == '_' && ++count == 2;
        }) != s1.end();

不过,我更愿意为此创建一个新函数,我们称之为find_if_n

template<typename Iterator, typename Predicate>
Iterator find_if_n(Iterator begin, Iterator end, Predicate&& pred, int n) {
    return std::find_if(begin, end,
                          [&pred, &n] (const auto& v) {
                             return pred(v) && --n == 0;
                          });
}

使用更简单:

bool found = find_if_n(s1.begin(), s1.end(), [] (char c) {
                  return c == '_';
             }, 2) != s1.end();

推荐阅读