如題,需要說明的是這個與我的上一篇博客是不一樣的,這個求的是前綴,多了個限定條件。
我的思路,
1. 首先可以按照上一篇的博客來解,但顯然浪費了。
2. 我們需要充分利用前綴這個條件,我的第一反應就是用棧,但是想來想去也沒有好辦法,後來想想,如果是迴文前綴,那麼一定會在迴文的另一端出現字符串的首字母。於是,
a. 遍歷字符串,找到所有與首字母相同的位置,存入數組ends,複雜度O(N);
b. 從最後一位開始遍歷ends,即loc=ends.length-1,設置變量i=1表示比對的字符位置,
循環{
判斷ends[loc]-i與i是否相同或者ends[loc]-i=i-1,即達到了aba或者aa的中間位置,
——是,則說明ends[loc]對應的位置是最大回文前綴的末尾字符,輸出這個子字符串;
——不是,則說明沒有檢查完畢,走下面的步驟;
判斷ends[loc]-i與i兩個位置上的字符是否相同,
——不同則說明這裏不是在迴文,跳出循環,loc–,遍歷下一個ends裏的位置;
——相同則繼續檢查字符,i++;
}
分析,想找到最壞情況,不過沒想到,你有什麼想法嗎?我舉一個看似比較費時的例子,abbabababa,這樣的情況下,b步中的遍歷複雜度爲O(N),其他情況應該也不會差很多吧。希望你能有更好的想法。
歡迎踊躍討論和拍磚!!