Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用STL算法找到分隔字符串中两个不同字母的最短星号序列?_C++_Algorithm_Stl - Fatal编程技术网

C++ 如何使用STL算法找到分隔字符串中两个不同字母的最短星号序列?

C++ 如何使用STL算法找到分隔字符串中两个不同字母的最短星号序列?,c++,algorithm,stl,C++,Algorithm,Stl,我有这样一个字符串: A*A**B***A** 我对两个不同字母之间的星号序列感兴趣,特别是我需要找到最短的星号序列的长度。当然,对于上面的字符串,答案是2:A**B 我可以使用传统的循环很容易地解决这个问题,我已经习惯了这样的循环: const string s = "A*A**B***A**"; string::size_type last_letter=-1, min_seq_len=s.size(); for(int i = 0; i < s.size(); i++) {

我有这样一个字符串:

A*A**B***A**

我对两个不同字母之间的星号序列感兴趣,特别是我需要找到最短的星号序列的长度。当然,对于上面的字符串,答案是2:
A**B

我可以使用传统的循环很容易地解决这个问题,我已经习惯了这样的循环:

const string s = "A*A**B***A**";
string::size_type last_letter=-1, min_seq_len=s.size();
for(int i = 0; i < s.size(); i++) {
    if(last_letter == -1 || s[i] == '*' || s[i] == s[last_letter]) {
        if(s[i] != '*') {
            last_letter = i;
        }
    } else {
        min_seq_len = min(min_seq_len, i-last_letter-1);
        last_letter = i;
    }
}
常量字符串s=“A*A**B***A**”; 字符串::size_type last_letter=-1,min_seq_len=s.size(); 对于(int i=0;i 但是,有没有办法使用C++、迭代器等?< /P> 我问这个问题是因为我注意到我在学习如何使用这些工具来解决算法问题时遇到了困难,相反,我发现手工编写循环更容易。最后,我想学习C++算法、范围、迭代器等的操作。 我对两个不同字母之间的星号序列感兴趣,特别是我需要找到最短的星号序列的长度

  • 你需要最小化一些东西。您可以使用
    std::min_元素

  • 有些东西是一堆“字母+星号+字母”块。您可以使用
    std::find\u if
    查找非星号

  • 然后,您需要在算法之间编写一些粘合剂,可以隐藏在类似STL的接口后面。例如:

    auto letter_pairs = letter_pair_generator(s);
    const auto min_seq_len = std::min_element(
        std::begin(letter_pairs), std::end(letter_pairs),
        [](const auto& x) { return x.asterisk_count(); });
    
    string s = "A*A**B***A**";
    for(const auto& p : letter_pair_generator(s)) cout << p;
    
    其中,
    letter\u pair\u generator
    std::string
    上的适配器,它公开了一个类似容器的接口,该接口返回两个不同的字母对,中间有星号。例如:

    auto letter_pairs = letter_pair_generator(s);
    const auto min_seq_len = std::min_element(
        std::begin(letter_pairs), std::end(letter_pairs),
        [](const auto& x) { return x.asterisk_count(); });
    
    string s = "A*A**B***A**";
    for(const auto& p : letter_pair_generator(s)) cout << p;
    
    string s=“A*A**B***A**”;
    
    对于(const auto&p:letter_pair_generator)cout我需要说的是,使用标准库并不能带来巨大的改进。但例如,如果没有明确的字母要求,那么示例将简单得多。无论如何,这是我的尝试

  • std::string::首先查找\u而不是\u的用法

    int best = s.size();
    int prev = -1;
    int next;
    
    while ((next = s.find_first_not_of("*", prev+1)) >= 0) {
        if (prev >= 0 && s[prev] != s[next]) {
            best = min(best, next - prev - 1);              
        }
        prev = next;
    }  
    
  • 可运行:

  • std::regex
    用法:

    regex r("(?=([^*][*]*[^*]))");
    
    int best = s.size();
    for (auto i = sregex_iterator(s.begin(), s.end(), r); i != sregex_iterator(); ++i) {
        int pos = i->position(1);
        int len = i->length(1); 
        if (s[pos] != s[pos + len -1]) {
            best = min(len-2, best);
        }
    }   
    

  • Runnable:

    您也可以使用
    字符串的
    首先查找\u而不是
    的\u

    size\u t min(str.length()),prev(0),found(0);
    而((find=str.find_first_not_of(“*”,prev))!=std::string::npos){
    如果(str[found]!=str[prev]&&found-prev

    Re,一堆“字母+星号+字母”组块:注意,因为一个字母可能是两个不同“组块”的一部分。