题目简介
一个字符串如果从左往右和从右往左读的结果是一样的,则称为回文字符串。写程序找出给定字符串的最长回文子串。例如字符串 abcbabcb,有多个回文字串 bcb,bab,cbabc,bcbabcb 等,其中最长回文子串为 bcbabcb。
说明
用从中心点开始向两边扩展的方法求回文串,然后不断更新最长回文串的长度即可。C++的substr()方法练习。
这是叫中心扩展法对吧?马拉车算法还没学。。
#include <bits/stdc++.h>
using namespace std;
string expand(string s, int c1, int c2)
{
int l = c1, r = c2;
int n = s.size();
while (l >= 0 && r <= n-1 && s[l] == s[r])
--l, ++r;
return s.substr(l+1, r-l-1);
}
string lps(string s)
{
int n = s.size();
if (!n) return "";
string lungo = s.substr(0, 1);
for (int i = 0; i < n-1; i++) {
string p1 = expand(s, i, i);
if (p1.size() > lungo.size())
lungo = p1;
string p2 = expand(s, i, i+1);
if (p2.size() > lungo.size())
lungo = p2;
}
return lungo;
}
int main()
{
int cas;
cin >> cas;
string s;
for (int t = 0; t < cas; ++t) {
cin >> s;
printf("case #%d:\n%d\n", t, lps(s).size());
}
}