发生至少两次的最长子串:C ++问题

时间:2011-07-10 13:52:49

标签: c++ string algorithm stl

标题很糟糕,我知道,但在我知道问题的答案之前,我想不出更好的一个。如果可以,请编辑。

我在OnlineJudge网站上解决(为了好玩)一个非常简单的问题。问题是:

  

输入:包含的单个字符串   小写拉丁字母。的长度   字符串至少为1且最多为100   输出一个数字就是   最长子串的长度   输入字符串至少出现   在该字符串中两次(事件可能重叠)。

示例输入: ababa
示例输出: 3

我使用以下代码 接受

#include <iostream>
#include <string>
#include <algorithm>
int main()
{
    std::string s;
    std::cin >> s;
    int max = 0;
    typedef std::string::const_iterator sit;
    sit end = s.end();
    for(sit it1 = s.begin(); it1 != end; ++it1)
        for(sit it2 = it1 + 1; it2 != end; ++it2)
            max = std::max(max, std::mismatch(it1, it1 + (end - it2), it2).first - it1);
    std::cout << max;
}

但是,我在测试42上 运行时错误 (我不知道那是什么输入 - 网站规则),但下面的代码与第一个。

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;

int main()
{
    string s;
    cin >> s;
    vector<size_t> dif;
    for(string::const_iterator it1 = s.begin(); it1 != s.end(); ++it1)
        for(string::const_iterator it2 = it1 + 1; it2 != s.end(); ++it2)
            dif.push_back(mismatch(it1, it1 + (s.end() - it2), it2).first - it1);
    cout << *max_element(dif.begin(), dif.end());
}

经过半个小时的仪式舞蹈,我放弃了。我无法弄清楚第二个代码有什么问题(除了效果稍差和可读性差的事实)。是我从const_iterator中减去iterator吗?或者因为int与size_t?代码使用MSVC8.0或9.0进行编译(在其站点上)。发布模式。有任何想法吗?感谢。

2 个答案:

答案 0 :(得分:8)

如果不运行代码,我认为第二个解决方案在长度为1的输入字符串上失败。

只要输入字符串的长度为1,您的dif向量就为空,这会导致*max_element(dif.begin(), dif.end())失败。

答案 1 :(得分:3)

它对长度为1的输入进行了段错误。

你试图从空载体中解除反射。