输入,输出和\ n

时间:2011-03-13 16:42:05

标签: c++ input newline

所以我试图解决这个问题,要求在字符串中查找回文,所以看起来我已经把一切都搞定了,但问题出在输出上。

这是原作和我的输出: 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和我读取输入的方式。我该如何解决这个问题?

2 个答案:

答案 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]