九度OJ 1528 最長回文字串

2021-06-16 22:07:00 字數 1672 閱讀 6885

回文大家應該都知道了,正反看都一樣,題目意思就是求乙個字串的子串,要求這個子串是回文。

最簡單的辦法:暴力法:(果斷的tle了)

判斷s[i,j]是不是回文

#include#include#include#include#include#includeusing namespace std;

char buf[200001], res[5005];

int main()

} if(ok && j - i + 1 > max)

max = j - i + 1;

}} printf("%d\n",max);

} return 0;

}

然後發現暴力法其實重複計算了不少,既然如此,用動態規劃:

lp[i][j]=true 表示buf[i...j]是回文

狀態轉移方程:lp[i][j]=p[i+1][j-1]   if(buf[i]==buf[j] 

如果buf[i+1...j-1]是回文,那麼如果buf[i]==buf[j],lp(i,j)=lp(i+1,j-1)

#include#include#include#include#include#includeusing namespace std;

char buf[200001], res[5005];

bool lp[20001][20001];

int main()

return r-l-1;

}int longestpalindrome3()

return longest;

}int main()

return 0;

}

思路比較簡單,而且效率很好。空間複雜度為o(1),時間複雜度為o(n^2)

傳說中的manacher演算法,時間複雜度可以降到o(n)【不過實際測試的時候發現m法耗時80ms,而中心法耗時僅為60ms,可能是我寫的不太好吧】

網上有很多解釋,不過都不怎麼清楚,

強烈建議大家去這個看看,絕對清晰明了,一下就會了:

**如下:

#include#include#includeusing namespace std;

string preprocess(string s)

int p[400005];

char str[400005];

char s[200001];

void preprocess()

int longestpalindrome()

} // find the maximum element in p.

int maxlen = 0;

for (int i = 1; i < n-1; i++)

} //delete p;

return maxlen;

}int main()

return 0;

}

好了,倒騰了一天,總算是搞完了這個東西了,不過話說昨晚九度的比賽,第一題真是坑爹,到現在各種pe了n次,還是不過,哎,算了算了,不去糾結這些無聊的東西了,還是好好看看有實際意義的東西吧。

最後的這道題還是挺有意思的,特別是學會了manacher演算法,人家講的也很清晰。

還是需要多多練習啊。

九度 1528 最長回文子串

題目描述 回文串就是乙個正讀和反讀都一樣的字串,比如 level 或者 noon 等等就是回文串。回文子串,顧名思義,即字串中滿足回文性質的子串。給出乙個只由小寫英文本元a,b,c.x,y,z組成的字串,請輸出其中最長的回文子串的長度。思路 1.使用列舉法判斷,時間複雜度會到 o n 3 2.動規的...

Jobdu 題目1528 最長回文子串

題目描述 回文串就是乙個正讀和反讀都一樣的字串,比如 level 或者 noon 等等就是回文串。回文子串,顧名思義,即字串中滿足回文性質的子串。給出乙個只由小寫英文本元a,b,c.x,y,z組成的字串,請輸出其中最長的回文子串的長度。輸入 輸入包含多個測試用例,每組測試用例輸入一行由小寫英文本元a...

Jobdu 題目1528 最長回文子串

題目描述 回文串就是乙個正讀和反讀都一樣的字串,比如 level 或者 noon 等等就是回文串。回文子串,顧名思義,即字串中滿足回文性質的子串。給出乙個只由小寫英文本元a,b,c.x,y,z組成的字串,請輸出其中最長的回文子串的長度。輸入 輸入包含多個測試用例,每組測試用例輸入一行由小寫英文本元a...