回文大家應該都知道了,正反看都一樣,題目意思就是求乙個字串的子串,要求這個子串是回文。
最簡單的辦法:暴力法:(果斷的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...