如何找到最长的阿尔卑斯子字符串 c++

How to find the longest alphebetical substring c++

本文关键字:阿尔卑斯 字符串 c++ 何找      更新时间:2023-10-16

我正在尝试编写一个函数,当给定一个字符串时,它将返回按字母顺序排序的最长子字符串。事实证明,这非常困难,尽管我进行了多次尝试,但我并没有比开始时更接近。

函数应执行的操作的示例:

abacdefkabfhxy 应返回 abcdefkxyabacdefkabfhixy 应返回 abcdefhixy

感谢您的任何帮助!

请尝试以下操作。它不会检查字符是否按字母顺序排列,但您可以自己轻松添加该条件:

#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>
#include <string>
std::string longest_alpha_substr(const std::string& str)
{
    char last = str[0];
    int size = 1;
    unsigned int i = 1;
    std::vector<std::pair<int, int>> pairs;
    for (; i < str.size(); ++i)
    {
        if (str[i] >= last)
        {
            last = str[i];
            ++size;
        } else
        {
            pairs.push_back(std::make_pair(i - size, size));
            size = 1;
            last = str[i];
        }
    }
    pairs.push_back(std::make_pair(i - size, size));
    using pair_type = std::pair<int, int>;
    auto max = std::max_element(pairs.begin(), pairs.end(),
                               [] (const pair_type& p1, const pair_type& p2)
    {
        return p1.second < p2.second;
    });
    return str.substr(max->first, max->second);
}
int main()
{
    std::string str = "ghijkdefghijabcde";
    std::cout << longest_alpha_substr(str); // "defghij"
}

对于每个字母表,给出值为 a=1,b=2...z=26。

现在解决最长递增子序列问题。

您将获得一系列递增的数字。

将它们转换回字母表,您就完成了。

A[1..n] - 输入序列L[j] = 在位置 j 结束的最长严格递增子序列

Recurrence eqn:

L[j] = max of i such that i<j & A[i] <A[j] {L[i]} + 1