天梯賽L2 008 最長對稱子串 25 分

2022-06-28 13:30:12 字數 1329 閱讀 7992

本來是打算用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再去遞減

而--i為先遞減i再去使用

單純從迴圈的角度說,後者的遞減效率更高

因此l = 1, r = 7,但實際上我們只有 l = 3到 r = 5時回文的

因此就要在原來基礎上減去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,...