Given a string, you are supposed to output the length of the longest symmetric sub-string. For example, given Is PAT&TAP symmetric?, the longest symmetric sub-string is s PAT&TAP s, hence you must output 11.
Input Specification:
Each input file contains one test case which gives a non-empty string of length no more than 1000.
Output Specification:
For each test case, simply print the maximum length in a line.
Sample Input:
Is PAT&TAP symmetric?
Sample Output:
11
中心扩展法:让每个元素和每两个元素分别做为中心,向两边拓展,更新最大值,这里的测试用例数据量比较小,暴力求解也能过
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int func(string& s, int left, int right)
{
while (left >= 0 && right < s.size() && s[left] == s[right])
{
left--;
right++;
}
return right - left - 1;
}
int longestPalindrome(string s) {
if (s == "")
return 0;
int Max = 0,start, end;
for (int i = 0; i < s.size(); i++)
{
int len = max(func(s, i, i), func(s, i, i + 1));
if (len > Max)
{
Max = len;
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return end - start + 1;
}
int main()
{
string str;
getline(cin, str);
cout << longestPalindrome(str);
return 0;
}
暴力算法:
#include<iostream>
#include<string>
using namespace std;
bool func(string str)
{
for (int i = 0; i <= str.size() / 2; i++)
if (str[i] != str[str.size() - i-1])
return false;
return true;
}
int main()
{
string str;
getline(cin, str);
for (int j = str.size(); j >= 1; j--)
for (int i = 0; i + j <= str.size(); i++)
if (func(str.substr(i, j)))
{
cout << j;
return 0;
}
return 0;
}
速度对比:
中心拓展法:
暴力求解: