出现至少两次的最长子字符串:c++ question
Longest substring that occurs at least twice: C++ question
我知道这个标题很糟糕,但在我知道问题的答案之前,我想不出更好的了。如果可以,请编辑。
我在一个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());
}
经过半个小时的仪式舞蹈,我放弃了。我不知道第二段代码有什么问题(除了它的效率和可读性稍差)。是用iterator
减去const_iterator
吗?还是因为int vs. size_t?代码是用MSVC8.0或9.0编译的(在他们的网站上)。发布模式。什么好主意吗?谢谢。
如果不运行您的代码,我认为您的第二个解决方案在长度为1的输入字符串上失败。
当输入字符串长度为1时,您的dif
向量为空,这导致*max_element(dif.begin(), dif.end())
失败。
它对长度为1的输入进行分段错误。