PAT-L2-008-最长对称子串
对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定”Is PAT&TAP symmetric?”,最长对称子串为”s PAT&TAP s”,于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:
Is PAT&TAP symmetric?
输出样例:
11
一开始的思路是枚举每个位置,之后这个位置开始,向两边依次比较,每次筛选最长的。 贴下这种思路的代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <cstdlib>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <bitset>
using namespace std;
int len;
string s;
int solve(int pos){
int i,j;
i = pos-1,j = pos+1;
int l = 1;
while(i>=0&&j<len){
if(s[i--]==s[j++]){
l+=2;
}
else{
break;
}
}
return l;
}
int main(int argc, const char * argv[]) {
getline(cin, s);
len = (int)s.length();
int res = 1;
for(int pos = 1;pos<len;pos++){
res = max(res,solve(pos));
}
cout<<res<<endl;
return 0;
}
但是会有像”abccba”这样的数据过不去,原因是枚举的是每个字符的位置,因为如果对称的话还可以关于两个字符中间对称。所以,枚举每个pos有两种情况
- 两个移动指针分别等于pos-1 pos+1
- 两个移动指针分别等于pos,pos+1
最后比较两种情况大小就可以了,注意如果是第二种情况时候需要–。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <cstdlib>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <bitset>
using namespace std;
int len;
string s;
int solve(int pos){
int i,j;
i = pos-1,j = pos+1;
int ln = 1;
while(i>=0&&j<len){
if(s[i--]==s[j++]){
ln+=2;
}
else{
break;
}
}
int lln = 1;
int l,r;
l = pos,r = pos+1;
while(l>=0&&r<len){
if(s[l--]==s[r++]){
lln+=2;
}
else {
break;
}
}
if(lln>ln){
return --lln;
}
else return ln;
// return ln>lln?ln:lln;
//return lln;
}
int main(int argc, const char * argv[]) {
getline(cin, s);
len = (int)s.length();
int res = 1;
for(int pos = 1;pos<len;pos++){
res = max(res,solve(pos));
}
cout<<res<<endl;
return 0;
}