所以我试图解决这个问题,要求在字符串中查找回文,所以看起来我已经把一切都搞定了,但问题出在输出上。
这是原作和我的输出: http://pastebin.com/c6Gh8kB9
以下是关于问题的输入和输入的说法:
输入格式:
不超过20,000的文件 字符。该文件有一个或多个 线。没有行超过80 字符(不包括换行符 最后)。
输出格式:
输出的第一行应该是最长的 发现了回文。下一行或 行应该是实际的文本 回文(没有任何围绕 白色空间或标点符号但有 所有其他字符)印在 线(或多行,如果 新行包含在 回文文本)。如果有 最长的多个回文 长度,输出出现的那个 第一
以下是我阅读输入的方法:
string test;
string original;
while (getline(fin,test))
original += test;
以下是我输出的方式:
int len = answer.length();
answer = cleanUp(answer);
while (len > 0){
string s3 = answer.substr(0,80);
answer.erase(0,80);
fout << s3 << endl;
len -= 80;
}
cleanUp()是一个从开头和结尾删除非法字符的功能。我猜测问题是\ n和我读取输入的方式。我该如何解决这个问题?
答案 0 :(得分:2)
没有行超过80个字符(不包括最后的换行符)
并不意味着除了最后一行之外每行都是80个字符,而输出代码通过在每次迭代中从answer
取80个字符来假设这一点。
您可能希望在换行阶段之前将换行符保留在字符串中。或者,您可以将换行位置存储在单独的std::vector
中。第一个选项使你的回文搜索程序变得复杂;第二个输出代码。
(如果我是你,我也会将answer
编入索引,而不是使用substr
/ erase
取消分块;您的输出代码现在是O( n < / em> ^ 2)虽然它可能是O( n )。)
答案 1 :(得分:1)
重读之后,似乎我误解了这个问题。我想的是每行代表一个单词,目的是测试那个“单词”是否是回文。
重读之后,我认为问题更像是:“给定最多20,000个字符的序列,找到最长的回文子序列。哦,顺便说一句,输入被分解成不超过80个字符的行。“
如果这是正确的,我会完全忽略行长度。我将整个文件读入一个缓冲区,然后在该缓冲区中搜索回文。
为了找到回文,我只需遍历阵列中的每个位置,找到最长的回文以其为中心点:
for (int i=1; i<total_chars; i++)
for (n=1; n<min(i, total_chars-i); n++)
if (array[i+n] != array[i-n])
// Candidate palindrome is from array[i-n+1] to array[i+n-1]