如何找到最长的阿尔卑斯子字符串 c++
How to find the longest alphebetical substring c++
我正在尝试编写一个函数,当给定一个字符串时,它将返回按字母顺序排序的最长子字符串。事实证明,这非常困难,尽管我进行了多次尝试,但我并没有比开始时更接近。
函数应执行的操作的示例:
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