2011-03-13 107 views
1

所以我试图解决这个问题,要求在字符串中寻找palindromes,所以好像我已经得到了一切正确的,但问题是与输出。输入,输出和 n的

这里是原来的我了放: 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; 
} 

清理()是从一开始就和删除非法字符的功能结束。我猜测问题出在\ n的和我阅读输入的方式上。我怎样才能解决这个问题 ?

+0

为什么不使用'f输出<< answer'到输出答案,而不调用“CleanUp”? – anatolyg 2011-03-13 18:33:39

回答

2

号线是超过80个字符(末尾不计算新行)长

并不意味着每行除了最后80个字符,而您的输出代码不承担此通过在每次迭代中关闭answer 80个字符。

您可能希望将换行符保留在字符串中直到输出阶段。或者,您可以在单独的std::vector中存储换行位置。第一个选项使您的回文搜索例程复杂化;第二个输出代码。

(如果我是你,我也索引answer,而不是采取大块了与substr/erase;现在你的输出代码为O(ñ^2),同时也可能是O(ñ) )

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] 
+0

相同的回文可以分为两行,因此逐行读取输入并检查该行内是否有回文是行不通的。 – Marijus 2011-03-13 17:32:41