QuestionDescribe:
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
结尾无空行
题目解读:求字符串的最长公共回文序列的长度。
题目分析:想到了dp、双指针等算法,但只能写出来暴力算法,要看双指针的拖到最后。
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
string str;
getline(cin, str);
int maxlen = 0;
for(int i = 0; i < str.size(); i ++){
for(int j = i; j < str.size(); j ++){
string a1 = str.substr(i, j - i + 1);
string a2 = a1;
reverse(a1.begin(), a1.end());
int len = a1.size();
if(a1 == a2)
maxlen = max(maxlen, len);
}
}
cout << maxlen << endl;
return 0;
}
ACwing大佬双指针做法
//双指针,往两边走,子串分奇偶
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
string str;
getline(cin,str);
int res=0;
for(int i=0;i<str.size();i++)
{
int l=i-1,r=i+1;
while(l>=0&&r<str.size()&&str[l]==str[r]) l--,r++;
res=max(res,r-l-1);
l=i,r=i+1;
while(l>=0&&r<str.size()&&str[l]==str[r]) l--,r++;
res=max(res,r-l-1);
}
cout<<res<<endl;
return 0;
}