2011-03-13 102 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