如何找到最长的字母子串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&lt;j &amp; A[i] &lt;A[j] L[i] + 1

【讨论】:

以上是关于如何找到最长的字母子串c ++的主要内容,如果未能解决你的问题,请参考以下文章

java语言中编程求解两个字符串最长相同字符串的长度

请帮忙///如何计算两个 字符串的最长公共子串

找到最长的回文子串

Leetcode最长回文子串

LeetCode5# 最长回文子串

LeetCode:无重复字符的最长子串(C语言版)