本來是打算用string做的,但不知道為什麼一直做不對
for(size_t i = buf.length(); i != 0; --i)
for(size_t j = 0; j + i <= buf.length(); ++j)
if(i / 2)
}else
}
這一條的思路是利用str可以直接匹配的優勢,結合reverse可以判斷回文
進一步,i代表最大回文量,所以只要找到合適的i就直接結束即可
聽起來很美好,但最後會有兩個點過不去,內在的問題不好修復
看來string的思路是不能走了qaq
上面策略出問題的核心在於,substr本身是要消耗時間的
多次substr實際上也只是多取幾個字元而已,浪費了很多不必要的時間
畢竟讓substr取abc和abcd,雖然是連續的,但還要再取一遍,時間成本太高
不如讓我們慢慢加上去
回文顯然存在兩種情況:
一種是像 abcdcba ,這樣的中間乙個對稱軸的回文
另一種則是abccbd ,這樣的中間對稱軸為空氣的回文
for(size_t i = 1; i != buf.length(); ++i)
這裡分析一下,while所帶來的問題,因為我們的判斷是滯後的導致l和r都多減加了兩次
舉個例子,對於 aacdcba, 當進行到d時
可以有 l = 3, r = 5此時還是相等的,因此向下一步
l = 2, r = 6, 你發現 'a' != 'c',因此要結束迴圈
但由於--和++的存在,判斷結束後仍然會執行計算,
i--為先使用i再去遞減因此l = 1, r = 7,但實際上我們只有 l = 3到 r = 5時回文的而--i為先遞減i再去使用
單純從迴圈的角度說,後者的遞減效率更高
因此就要在原來基礎上減去4,也就是r - l + 1 變為 r - l - 3
不用擔心爆資料,因為r本來就比l多4
for(size_t i = 0; i != buf.length(); ++i)
寫出這兩種情況之後就可以放在**裡執行啦
#include #include using namespace std;
size_t maxn = 1;
int main()
for(size_t i = 0; i != buf.length(); ++i)
cout << maxn;
}
L2 008 最長對稱子串
時間限制 100 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 對給定的字串,本題要求你輸出最長對稱子串的長度。例如,給定 is pat tap symmetric?最長對稱子串為 s pat tap s 於是你應該輸出11。輸入格式 輸入在一行...
L2 008 最長對稱子串
對給定的字串,本題要求你輸出最長對稱子串的長度。例如,給定 is pat tap symmetric?最長對稱子串為 s pat tap s 於是你應該輸出11。對給定的字串,本題要求你輸出最長對稱子串的長度。例如,給定 is pat tap symmetric?最長對稱子串為 s pat tap ...
L2 008 最長對稱子串
原題 這道題可真是把我累的夠嗆,一開始是方法錯了,後來是題目定義不清晰理解錯誤,最後終於在第12次提交成功,廢話不說,總結如下 1.對稱,就是倒置之後還是不變,例如 aba 顛倒後還是 aba 所以思路就是,把原字串s1倒置過來,變成s2,然後求s1和s2最長公共子串 2.因為s1倒置過來變成s2,...