如何找到最长的字母子串c ++
Posted
技术标签:
【中文标题】如何找到最长的字母子串c ++【英文标题】:How to find the longest alphebetical substring c++ 【发布时间】:2013-11-15 19:32:57 【问题描述】:我正在尝试编写一个函数,当给定一个字符串时,它将返回按字母顺序排序的最长子字符串。事实证明,这非常困难,尽管进行了多次尝试,但我并没有比开始时更接近。
函数应该做什么的例子:
abcdefkabfhxy 应该返回 abcdefkxy abacdefkabfhixy 应该返回 abcdefhixy
感谢您的帮助!
【问题讨论】:
这被称为最长递增子序列问题:en.wikipedia.org/wiki/Longest_increasing_subsequence Find longest increasing sequence的可能重复 还有一个 - How to determine the longest increasing subsequence using dynamic programming? 并且,为了记录,一般来说,子字符串与子序列不同。子串通常被认为是一个连续的子序列。 感谢您的意见! 【参考方案1】:试试下面的。它不会检查字符是否为字母,但您可以自己轻松地添加该条件:
#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"
【讨论】:
【参考方案2】:对于每个字母表,给出 a=1,b=2...z=26 的值。
现在解决最长递增子序列问题。
你会得到一个递增的数字序列。
将它们转换回字母就完成了。
A[1..n] - 输入序列 L[j] = 在位置 j 结束的最长严格递增子序列
递归方程:
L[j] = max of i such that i<j & A[i] <A[j] L[i] + 1
【讨论】:
以上是关于如何找到最长的字母子串c ++的主要内容,如果未能解决你的问题,请参考以下文章